UVa 352 The Seasonal War

本文介绍了一个基于广度优先搜索(BFS)算法的应用实例,详细展示了如何通过BFS解决鹰巢计数问题,包括初始化环境、移动方向设定、访问标记等关键步骤。

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.输入以字符形式输入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值