HDU 1198

此题是搜索入门题目。以某一点为中心,向四个方向搜索。搜过的做好标记,将不再搜。每个点遍历一次,当搜索完一次,代表连通分支又多一个。最后得到的连通分支数就是我们所要求的。

以下是代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
//上下左右的顺序定义数组0,1,2,3
char 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;
}

posted @ 2014-04-26 15:31  pengmq  阅读(254)  评论(0编辑  收藏  举报