同样的题目,解法不同
前一次是深度优先搜索
这一次是广度优先搜索
代码
#include<stdio.h>
#include<queue>
using namespace std;
int L,n,m,s;
int f[8][2]={0,-1,0,1,-1,0,1,0,-1,1,1,1,1,-1,-1,-1},a[505][505];
struct node
{
int x,y; //定义队列
};
queue<node>Q;
int bfs(int x,int y)
{
int L=0;
node q;
q.x=x;
q.y=y;
Q.push(q); //把找到的岛屿入队
L++;
a[q.x][q.y]=0;
while(!Q.empty()) //为空说明遍历完成,即完整找到一块岛屿
{
node e,w;
e=Q.front(); //队首元素
for(int i=0;i<8;i++)
{
w.x=e.x+f[i][0];
w.y=e.y+f[i][1]; //往四周寻找能达到的‘1’
if(w.x>=0&&w.y>=0&&w.x<m&&w.y<n&&a[w.x][w.y]==1)
{
Q.push(w); //每次入队一个,说明找到一个‘1’ 即岛屿面积加1
L++;
a[w.x][w.y]=0;
}
}
Q.pop(); //和队首元素直接相连的元素已全部入栈,抛出队首元素
}
return L;
}
int main()
{
int i,j,k=0,sum[505];
char b; int count=0;
scanf("%d %d %d",&m,&n,&s);
getchar();
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%c",&b);
if(b==' ')
j--;
else
a[i][j]=b-'0';
}
getchar();
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]==1)
{
sum[k]=bfs(i,j);
count++;
k++;
}
}
}
for(i=1;i<k;i++)
{
if(sum[i]>sum[0]) sum[0]=sum[i];
}
printf("%d %d
",count,sum[0]*s);
return 0;
}
深搜借助的是递归(栈)的思想来解决
我理解为:只要符合条件就闷着头往里钻,知道最后一个没路了
回过头看上一步,直到回到第一步 完成遍历。
而广度优先搜索借助的是队列的思想来解决的
我理解为:把第一步符合题意的先入队,开始第二步,
把和队首元素直接相连的元素依次压入队列,然后抛出队首元素,
重复进行,直到队列为空,遍历结束。