bfs的题目。
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int IsVis[26][26];//记录位置是否被访问
char Eagles[26][26];
typedef struct node
{
int x,y;
}War;
int Move[8][2]={-1,0, 0,1, 1,1, 1,0, -1,1, 0,-1, 1,-1, -1,-1};//移动方位
void Bfs(int x,int y);
int Judge();
int line,EaglesNum;
queue<War> Que;
int main(){
//freopen("D:\\t.txt","r",stdin);
int flag = 1;
while(cin>>line){
for(int i = 0;i< line;i++){
for(int j = 0;j < line;j++){
cin>>Eagles[i][j];
}
}
EaglesNum = Judge();
cout<<"Image number "<< flag <<" contains "<<EaglesNum<<" war eagles."<<endl;
flag++;
}
return 0;
}
int Judge(){
War p;
int Num = 0;
memset(IsVis,0,sizeof(IsVis));//每一回合初始化
for(int i = 0;i< line;i++){
for(int j = 0;j < line;j++){
if(Eagles[i][j] == '1' && !IsVis[i][j]){
p.x = i;
p.y = j;
Que.push(p);
Bfs(i,j);
Num++;
}
}
}
return Num;
}
void Bfs(int x,int y){
War m,n;
while(!Que.empty()){
m = Que.front();
IsVis[m.x][m.y] = 1;
for(int k = 0;k < 8;k++){
if((m.x + Move[k][0] >= 0) && (m.x + Move[k][0] < line) && (m.y + Move[k][1] >= 0) && (m.y + Move[k][1] < line)
&& !IsVis[m.x + Move[k][0]][m.y + Move[k][1]]){//判断移动是否超范围及是否被访问
n.x = m.x + Move[k][0];
n.y = m.y + Move[k][1];
IsVis[n.x][n.y] = 1;
if(Eagles[n.x][n.y] == '1')Que.push(n);
}
}
Que.pop();
}
}
1.注意队列使用;
2.注意移动范围;
3.输入以字符形式输入。
本文介绍了一个基于广度优先搜索(BFS)算法的应用实例,详细展示了如何通过BFS解决鹰巢计数问题,包括初始化环境、移动方向设定、访问标记等关键步骤。
1059

被折叠的 条评论
为什么被折叠?



