题目很简单是最基础的搜索题
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=27
首先是深搜写法,递归
代码如下:
#include
#include
int m[100][100],a,b;
int f[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
void dfs(int k,int s)
{
int i;
m[k][s]=0;
for(i=0;i<4;i++)
if(m[k+f[i][0]][s+f[i][1]]==1)
dfs(k+f[i][0],s+f[i][1]);
}
int main()
{
int n,i,j,count;
scanf("%d",&n);
while(n--)
{
count=0;
scanf("%d%d",&a,&b);
for(i=1;i<=a;i++)
for(j=1;j<=b;j++)
scanf("%d",&m[i][j]);
for(i=1;i<=a;i++)
for(j=1;j<=b;j++)
{
if(m[i][j]==1)
{
count++;
dfs(i,j);
}
}
printf("%d\n",count);
}
return 0;
}
广搜写法,队列
#include
#include
#include
using namespace std;
int a,b,m[100][100];
int f[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
struct point
{
int x,y;
};
queue v;
void bfs(int k,int s)
{
int i;
point L,p,q;
L.x=k;L.y=s;
v.push(L);
m[k][s]=0;
while(!v.empty())
{
p=v.front();
for(i=0;i<4;i++)
{
if(m[p.x+f[i][0]][p.y+f[i][1]]==1)
{
m[p.x+f[i][0]][p.y+f[i][1]]=0;
q.x=p.x+f[i][0];q.y=p.y+f[i][1];
v.push(q);
}
}
v.pop();
}
}
int main()
{
int n,i,j,count;
scanf("%d",&n);
while(n--)
{
count=0;
scanf("%d%d",&a,&b);
for(i=1;i<=a;i++)
for(j=1;j<=b;j++)
scanf("%d",&m[i][j]);
for(i=1;i<=a;i++)
for(j=1;j<=b;j++)
if(m[i][j]==1)
{
count++;
bfs(i,j);
}
printf("%d\n",count);
}
return 0;
}
这篇文章是转载我的好友HRD的文章,刚好我复习深搜广搜,顺便转了过来!