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 characters
15   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 } 
What I don't dare to say is I can't!
原文地址:https://www.cnblogs.com/sytu/p/3854688.html