题目很简单是最基础的搜索题
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=27
首先是深搜写法,递归
代码如下:
- #include<stdio.h>
- #include<stdlib.h>
- 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<stdio.h>
#include<stdlib.h>
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<stdio.h>
- #include<algorithm>
- #include<queue>
- 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<point> 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;
- }
#include<stdio.h>
#include<algorithm>
#include<queue>
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<point> 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的文章,刚好我复习深搜广搜,顺便转了过来!