这个题目好吓人呀!嘿嘿---
不过仔细分析下就可以啦!
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 }