首页 > 代码库 > ACM1198Farm Irrigation

ACM1198Farm Irrigation

这个题目好吓人呀!嘿嘿---

不过仔细分析下就可以啦!

 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=550; 5 int Gra[11][4]={ 6 {1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0}, 7 {1,0,1,0},{0,1,0,1},{1,1,0,1}, 8 {1,0,1,1},{0,1,1,1},{1,1,1,0},{1,1,1,1}}; 9 int direction[4][2]={{-1,0},{0,1},{1,0},{0,-1}};10 //11种铸造方式,1为开,0为关11  //用输入的大写字母减去‘A‘ 即可12   //2和下面的0可相加13   //3->1;0->2;1->3; 14   int m,n;//m lines and n characters15   int map[N][N];16 int vis[N][N];17 void dfs(int x,int y)18 {19     vis[x][y]=1;20     for(int i=0;i<4;i++) 21     {22         int X=x+direction[i][0];23         int Y=y+direction[i][1];24         int j=(i>=2)?(i-2):(i+2);//顺序绝对不可以改,或者要改一起改,有点变动就是wrong 25         if(Gra[map[x][y]][i]&&0<X&&X<=m&&0<Y&&Y<=n)26         {27             if(!vis[X][Y]&&Gra[map[X][Y]][j])28             dfs(X,Y);29         }30     }31 }32 int main()33 {34     char ch[N];35     while(cin>>m>>n)36     {37         if(m<0||n<0)break;//exit;38         memset(vis,0,sizeof(vis));39         for(int i=1;i<=m;i++)40         {41             cin>>ch;42             for(int j=0;j<n;j++)43                 map[i][j+1]=ch[j]-A;44         }45         int count=0;46         for(int i=1;i<=m;i++)47         {48             for(int j=1;j<=n;j++)49             if(!vis[i][j])50             dfs(i,j),count++;51         }52         cout<<count<<endl;53     }54     return 0;55 }