图的遍历(下)
上次我们讲了深度优先搜索,这次我们用广度优先搜索去处理“The seasons war”。
广度优先搜索(bfs)是指按照广度方向搜索。它的基本思想:
①从图中某个顶点v出发,首先访问v。
②依次访问v的各个未被访问的邻接点。
③分别从这些邻接点(端结点)出发,依次访问它们的各个未被访问的邻接点(新的端结点)。访问时应保证:如果v1和v2为当前端结点,且v1在v2之前被访问,则v1的所有未被访问的邻接点应在v2的所有未被访问的邻接点之前访问。重复③,直到所有端结点均没有未被访问的邻接点为止。
若此时还有顶点未被访问,则选一个未被访问的顶点作为起始点,重复上述过程,直至所有顶点均被访问过为止。
题目的话,大家可以看一下上次的博客,这里就不写了,直接看代码:
#include<stdio.h>
#include<queue>
using namespace std;
char a[30][30];
int b[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
int n,t=1;
struct node
{
int x;
int y;
};
void bfs(int x,int y)
{
queue<node>Q;
node st,en;
st.x=x;
st.y=y;
while(!Q.empty())
Q.pop();
Q.push(st);
while(!Q.empty())
{
st=Q.front();
Q.pop();
for(int k=0;k<8;k++)
{
en.x=st.x+b[k][0];
en.y=st.y+b[k][1];
if(en.x<0||en.y<0||en.x>=n||en.y>=n)
continue;
if(a[en.x][en.y]=='1')
{
a[en.x][en.y]='0';
Q.push(en);
}
}
}
}
int main()
{
while(~scanf("%d",&n))
{
int sum=0;
for(int i=0; i<n; i++)
scanf("%s",a[i]);
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if(a[i][j]=='1')
{
sum++;
bfs(i,j);
}
printf("Image number %d contains %d war eagles.\n",t++,sum);
}
return 0;
}
当然运行结果是一样的: