引水入城
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int maxn=507; 6 int h[maxn][maxn],l[maxn][maxn],r[maxn][maxn],ans1,ans2; 7 int n,m; 8 bool vis[maxn][maxn],flag; 9 int dx[4]={0,1,0,-1}; 10 int dy[4]={-1,0,1,0}; 11 void dfs(int x,int y){ 12 vis[x][y]=true; 13 for(int i=0;i<4;i++){ 14 if(x+dx[i]<1||x+dx[i]>n||y+dy[i]<1||y+dy[i]>m) continue; 15 if(h[x+dx[i]][y+dy[i]]>=h[x][y]) continue; 16 if(!vis[x+dx[i]][y+dy[i]]) dfs(x+dx[i],y+dy[i]); 17 l[x][y]=min(l[x][y],l[x+dx[i]][y+dy[i]]); 18 r[x][y]=max(r[x][y],r[x+dx[i]][y+dy[i]]); 19 } 20 } 21 int main(){ 22 memset(l,0x7f,sizeof(l)); 23 cin>>n>>m; 24 for(int i=1;i<=n;i++) 25 for(int j=1;j<=m;j++) 26 cin>>h[i][j]; 27 for(int i=1;i<=m;i++) 28 l[n][i]=i,r[n][i]=i;//因为只初始化了沙漠地区,所以是沙漠地区的值不断往上传 29 for(int i=1;i<=m;i++) 30 if(!vis[1][i]) dfs(1,i); 31 for(int i=1;i<=m;i++){ 32 if(!vis[n][i]) ans1++; 33 } 34 if(ans1>0) cout<<0<<endl<<ans1<<endl; 35 else{ 36 int sta=1,end=1; 37 while(sta<=m){//end<=m错,end永远<=m 38 for(int i=1;i<=m;i++){ 39 if(l[1][i]<=sta){ 40 end=max(end,r[1][i]); 41 } 42 } 43 ans2++; 44 sta=end+1; 45 } 46 cout<<1<<endl<<ans2<<endl; 47 } 48 return 0; 49 }