广度搜索BFS hdu-1312

本文介绍了一种使用广度优先搜索(BFS)算法解决迷宫问题的方法。通过C++实现,利用队列数据结构存储待探索的节点,并借助自定义数组记录已访问路径。文章详细解释了BFS算法的工作原理及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;


int W,H;
char maze[20][20];
int S_x,S_y;
int sign[20][20];
int x_dir[4]={0,0,1,-1},y_dir[4]={-1,1,0,0};
int number;
typedef struct point
{
    int x;
    int y;
}POINT;


void bfs(int S_x,int S_y)
{
    memset(sign,0,sizeof(sign));
    queue<POINT> p;
    POINT S_point;
    S_point.x=S_x,S_point.y=S_y;
    p.push(S_point);
    sign[S_point.y][S_point.x]=1;
    while(!p.empty())
    {
        POINT T_point;
        T_point=p.front();
        p.pop();
        number++;
        POINT N_point;
        for(int i=0;i<4;i++)
        {
            N_point.x=T_point.x+x_dir[i];
            N_point.y=T_point.y+y_dir[i];
            if(N_point.x<0||N_point.x>=W||N_point.y<0||N_point.y>=H||sign[N_point.y][N_point.x]||(maze[N_point.y][N_point.x]=='#')) continue;
            p.push(N_point);
            sign[N_point.y][N_point.x]=1;
        }
    }
}


int main()
{
    while(scanf("%d %d",&W,&H)&&W+H)
    {
        for(int i=0;i<H;i++)
        {
            scanf("%s",maze[i]);
            for(int j=0;j<W;j++)
            {
                if(maze[i][j]=='@')
                {
                    S_x=j,S_y=i;
                    break;
                }
            }
        }
        bfs(S_x,S_y);
        printf("%d\n",number);
        number=0;
    }
    return 0;
}

      方法:广度优先搜索先穷竭遍历某定点的上下左右四个方向,将满足不越界,不碰墙,没走过的点全部入队,再在下次循环时判断队列是否为空,非空则说明有满足条件不越界,不碰墙,没走过的点,然后在遍历该点的值的上下左右四个方向重复上述操作;

     队列应用:在该题中队列起了储存满足条件的点和判断广度搜索函数bfs是否需要继续运行的作用;队列包含在头文件<string.h>中,且只存在于C++中;

    memset应用:起到初始化数组的作用,将某个数组的每个元素变为同一个值;

    自定义数组sign[20][20]作用:判读该点有无走过,走过则为1,未走过则为0;

    队列中各函数作用:queue<b>a初始化b类型的a队列,push(a)将a放入队列,front从底部读取(先进先出)第一个元素的数值(该元素仍留在队列中),pop从底部取走第一个元素(该元素被取走),a.empty()判断队列是否为空;

    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值