搜索实现迷宫(队列)

来源:互联网 发布:amd优化游戏 编辑:程序博客网 时间:2024/05/29 11:05



bfs

#include <iostream>#include <queue>using namespace std;#define MAX_N 10#define MAX_M 10const int INF = 100000000;typedef pair<int ,int> P;char maze[MAX_N][MAX_M+1] ={    { '#', 'S', '#' , '#','#', '#', '#', '#', '.', '#'},    { '.', '.', '.' , '.','.', '.', '#', '.', '.', '#'},    { '.', '#', '.' , '#','#', '.', '#', '#', '.', '#'},    { '.', '#', '.' , '.','.', '.', '.', '.', '.', '.'},    { '#', '#', '.' , '#','#', '.', '#', '#', '#', '#'},    { '.', '.', '.' , '.','#', '.', '.', '.', '.', '#'},    { '.', '#', '#' , '#','#', '#', '#', '#', '.', '#'},    { '.', '.', '.' , '.','#', '.', '.', '.', '.', '.'},    { '.', '#', '#' , '#','#', '.', '#', '#', '#', '.'},    { '.', '.', '.' , '.','#', '.', '.', '.', 'G', '#'},};int N = 10, M = 10;int sx = 0;int sy = 1;int gx = 9;int gy = 8;int d[MAX_N][MAX_M];int dx[4] = {1, 0, -1, 0}, dy[] = { 0, 1, 0, -1};int bfs(){    queue<P> que;    // 初始化所有距离为INF    for( int i = 0; i < N;i++)    {        for( int j = 0; j <M; j++)        {            d[i][j] = INF;        }    }    // 将起点加入队列,并将这一点的距离设置为0    que.push(P(sx, sy));    d[sx][sy] = 0;    while( que.size())    {        P p = que.front();que.pop();        if(p.first == gx&& p.second == gy)            break;        // 向四个方向循环        for( int i = 0; i <4; i++ )        {            // 移动之后的坐标            int nx = p.first +dx[i];            int ny = p.second+ dy[i];            // 判断是否可以移动以及是否已经访问过(d[nx][ny] != INF即已经访问过)            if(0<= nx&& nx < N && 0 <= ny && ny < M &&maze[nx][ny] != '#' && d[nx][ny] == INF)            {                // 可以移动的话,将它加入队列,并且到达该位置的距离确定为到p的距离+1                que.push(P(nx,ny));                d[nx][ny] = d[p.first][p.second]+ 1;            }        }    }    return d[gx][gy];}int main(){    int res = bfs();    cout <<"Result: " << res << endl;    return 0;}



#include<iostream>#include<queue>using namespace std;const int INF= 1e+8;const int  max_n=10;typedef pair<int,int> P;  //用pair表示状态 和map一样 较方便//输入char maze[max_n][max_n+1];// 表示迷宫的字符串数组int n=10,m=10;int sx=0,sy=1;//起点坐标int gx=9,gy=8;//终点坐标int d[max_n][max_n];  //到各个位置的最短距离的数组//四个方向的向量int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};//求从(sx,sy)到(gx,gy)的距离//如果无法到达,则是INFbool limit(int x,int y){return 0<= x&& x < n && 0 <= y && y < m &&maze[x][y] != '#' && d[x][y] == INF;}int bfs(){queue<P> que;for(int i=0;i<n;i++)  //初始化为INFfor(int j=0;j<m;j++)d[i][j]=INF;que.push(P(sx,sy));//将起点加入队列,并把这一点的距离设为0d[sx][sy]=0;//不断循环知道队列的长度为0while(que.size())  //队列的长度{//从队列的最前端取出元素P p=que.front();que.pop();//并删除该元素//如果取出的状态是终点则 结束搜索if(p.first==gx&&p.second==gy)break;//四个方向的循环for(int i=0;i<4;i++){//移动后的位置标记为(nx,ny)int nx=p.frist+dx[i];int ny=p.second+dy[i];//判断是否可以移动以及是否已经访问过if(limit(nx,ny)){que.push(p(nx,ny));d[nx][ny]=d[p.first][p.second]+1;}}}return d[gx][gy];}void solve(){int res=bfs();cout<<res<<endl;}int main(){solve();return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手指陀螺不转了怎么办 月经推迟私处还老是流水怎么办 苹果手机刷机后忘记id密码怎么办 锤基意外怀孕怎么办零6 职场遇到心机婊怎么办 高二会考没过怎么办 保险柜没电了打不开怎么办 保险柜没有电了打不开怎么办 小保险箱没电了怎么办 bim墙的颜色反了怎么办 眼睛大但是无神怎么办 吃了凉的胃难受怎么办 吃凉东西胃疼怎么办 游戏只有一个分辨率选项怎么办 玩游戏心态易崩怎么办 打游戏心态炸了怎么办 赛鸽比赛回来拉稀怎么办 鸽子拉竹节水便怎么办 新买的鸽子拉稀怎么办 信鸽羽毛上长了虫子怎么办 羊肉煮熟了太硬怎么办 切菜不小心切到手指怎么办 打荷盘子端错了怎么办 学厨师不会翻锅怎么办? 在饭店上班不给工资怎么办 炒菜的左手拿不起锅怎么办?? 厨师想尽快上手炒菜怎么办? 空调吹的肩膀痛怎么办 学厨师翻锅不会怎么办 肋软骨隆鼻太硬怎么办 百度云下载速度慢怎么办 买的种子没出怎么办 铃木小r烧整流器怎么办 厨师在厨房太热怎么办 被家长投诉体罚孩子怎么办 空腹彩超喝水了怎么办 鱼把厕.所堵了怎么办 螃蟹爬进厕所里怎么办 抄作业被老师发现怎么办 鱼把厕所堵了怎么办 刚憋尿上完厕所之后腹部很疼怎么办