|
- #include<bits/stdc++.h>
- using namespace std;
- int dx[]={-1,0,1,0};
- int dy[]={0,1,0,-1};
- int mp[510][510],f[520],vis[510][510],ans,l[510][510],r[510][510],n,m;
- bool flag=1;
- void dfs(int x,int y)
- {
- vis[x][y]=1;
- for(int i=0;i<4;i++)
- {
- int x1=x+dx[i];
- int y1=y+dy[i];
- if(x1<1 || x1>n || y1<1 || y1>m || mp[x][y]<=mp[x1][y1]) continue;
- if(!vis[x1][y1]) dfs(x1,y1);
- l[x][y]=min(l[x][y], l[x1][y1]);
- r[x][y]=max(r[x][y], r[x1][y1]);
- }
- }
- int main()
- {
- memset(l, 21000000, sizeof(l));
- cin>>n>>m;
- for(int i=1;i<=n;i++)
- for(int j=1;j<=m;j++)
- {cin>>mp[i][j];if (i==n) l[i][j]=r[i][j]=j;}
- for(int i=1;i<=m;i++)
- if(!vis[1][i])dfs(1,i);
- for(int i=1;i<=m;i++)if(!vis[n][i]) {flag=0;ans++;}
- if(!flag) {cout<<0<<endl<<ans<<endl;return 0;}
- f[1]=1;
- int left=1,right=r[1][1];
- while (left<=m)
- {
- for(int i=1;i<=m;i++)
- if (l[1][i]<=left)right=max(right, r[1][i]);
- left=right+1;
- ans++;
- }
- cout<<1<<endl<<ans<<endl;
- return 0;
- }
复制代码 |
|