引水入城

 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 } 

 

posted @ 2018-08-12 20:04  lcan  阅读(130)  评论(0编辑  收藏  举报