此题是搜索入门题目。以某一点为中心,向四个方向搜索。搜过的做好标记,将不再搜。每个点遍历一次,当搜索完一次,代表连通分支又多一个。最后得到的连通分支数就是我们所要求的。
以下是代码:
#include<iostream>
#include<cstdio>#include<cstring>using namespace std;//上下左右的顺序定义数组0,1,2,3char a[12][4]={ {1,0,1,0},{1,0,0,1},{0,1,1,0},{0,1,0,1},{1,1,0,0},{0,0,1,1},{1,0,1,1},{1,1,1,0},{0,1,1,1},{1,1,0,1},{1,1,1,1}};int f[3000];int sign,m,n,sum;char s[51][51];void mysearch(int i)
{if(!f[i]){
if(!sign) {sign=1;sum++;}//sign=0等于0,说明再一次开始搜 f[i]=1; int x=i/n,y=i%n; if(x-1>=0&&!f[i-n]&&a[s[x][y]-65][0] &&a[s[x-1][y]-65][1]) mysearch(i-n);//向上搜 if(x+1<m&&!f[i+n]&&a[s[x][y]-65][1] &&a[s[x+1][y]-65][0]) mysearch(i+n);//向下 if(y-1>=0&&!f[i-1]&&a[s[x][y]-65][2] &&a[s[x][y-1]-65][3]) mysearch(i-1);//向左 if(y+1<n&&!f[i+1]&&a[s[x][y]-65][3] &&a[s[x][y+1]-65][2]) mysearch(i+1);//向右 }}int main(){ int i; while(cin>>m>>n){ if(m==-1&&n==-1) break; sum=0; for(i=0;i<m;i++) scanf("%s",s[i]); for(i=0;i<m*n;i++){ sign = 0; mysearch(i); } cout<<sum<<endl; memset(f,0,sizeof f); } return 0;}