/*
10 10
#.######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#....#
0 1
9 8
*/
#define _CRT_SECURE_NO_WARNINGS
/*
10 10
#.######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#....#
0 1
9 8
*/
#include <iostream>
#include <utility>
#include <queue>
using namespace std; const int INF = ;
const int MAX_N = , MAX_M = ; typedef pair<int, int> P;
//输入
char maze[MAX_N][MAX_M];
int N, M;
int sx, sy;
int gx, gy;
//到各个位置最短距离的数组
int d[MAX_N][MAX_M]; //4个方向移动的向量--下,右,上,左
int dx[] = { , , -, }, dy[] = { , , , - }; //从(sx, sy) 到 (gx, gy)的最短距离
int bfs()
{
queue<P> que;
for (int i = ; i < N; i++) //未走过的都为INF
for (int j = ; 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 = ; i < ; i++) {
//移动之后的位置为 (nx, ny)
int nx = p.first + dx[i], ny = p.second + dy[i]; //当前位置+方向 //判断是否可以移动以及是否已经访问过 (d[nx][ny] != INF 则已经访问过)
if ( <= nx && nx < N && <= ny && ny < M && maze[nx][ny] != '#' && d[nx][ny] == INF) {
que.push(P(nx, ny)); //将没有走过的路,入队
//可以移动的话,则加入到队列,并且到该位置的距离确定为到p的距离+1
d[nx][ny] = d[p.first][p.second] + ;
}
}
}
return d[gx][gy];
} void solve()
{
int res = bfs();
printf("%d\n", res);
} void Input()
{
cout << "设置Maze大小: \n";
cin >> N >> M;
cout << "设置迷宫(通路为 '.', 墙为'#'):\n";
for (int i = ; i < N; i++) {
for (int j = ; j < M; j++)
cin >> maze[i][j];
}
cout << "设置入口: (sx, sy): ";
cin >> sx >> sy;
cout << "设置出口: (gx, gy): ";
cin >> gx >> gy;
} int main(int argc, char const *argv[])
{
Input();
solve();
return ;
}

BFS_Maze_求解迷宫最短路径的更多相关文章

  1. Java求解迷宫问题:栈与回溯算法

    摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1)  选择一个 ...

  2. BFS求解迷宫的最短路径问题

    题目:给定一个大小为N*M的迷宫,迷宫由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置.试求出起点到终点的最小步数.(本题假定迷宫是 ...

  3. 迷宫最短路径问题的dfs,bfs实现

    迷宫的最短路径 给定一个大小为 N×M的迷宫.迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动.请求出从起点到终点所需的小步数.请注意,本题假定从起点一定可以移动到终点 限制条件:N,M ...

  4. 【数据结构】10分钟教你用栈求解迷宫老鼠问题超详细教程附C++源代码

    问题描述 给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口.如下图所示: 该图是一个矩形区域,有一个入口和出口.迷宫内部包含不能穿越的墙壁或者障碍物.这些障碍物沿着行和列放置,与迷宫的边界 ...

  5. 深度优先搜索(DFS)和广度优先搜索(BFS)求解迷宫问题

    用下面这个简单的迷宫图作为例子: OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOXXOOOX XOOOOXOO XXXXXXXO O为通路,X为障碍物. ...

  6. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

  7. cdoj1088-王之迷宫 (三维迷宫最短路径)【BFS】

    http://acm.uestc.edu.cn/#/problem/show/1088 王之迷宫 Time Limit: 3000/1000MS (Java/Others)     Memory Li ...

  8. zoj1649-Rescue (迷宫最短路径)【bfs 优先队列】

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=649 Rescue Time Limit: 2 Seconds      Mem ...

  9. 个人项目Individual Project:迷宫求解

    源码的github链接:           https://github.com/zhangxue520/test 1.1问题描述: a.问题描述:以一个m * n的长方阵表示迷宫,0和1分别表示迷 ...

随机推荐

  1. Android Automotive开发之一《编译自己的SDK 》 // TOBEDONE

    自己动手编译最新Android源码及SDK : http://blog.csdn.net/dd864140130/article/details/51718187官方文档,怎样编译sdk : http ...

  2. webView和js交互

    与 js 交互 OC 调用 JS // 执行 js - (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *title = [web ...

  3. 入门:Java Map<String,String>遍历及修改

    重点:在使用Map时注意key-value,key用于检索value的内容. 在正常情况下,可以不允许重复:在java中分为2中情况,一是内存地址重复,另一个是不同的地址但内容相等. 在使用Map是一 ...

  4. wifi万能钥pc版提示手机未连接

     关于PC版万能钥匙的用法 大部分人都是在“未连接到手机”再不知道怎么搞了 怎么连接到手机呢? 首先要把你的手机变成路由器 让电脑连上 这个都知道怎么搞吧 手机版万能钥匙有个一键让手机变成热点 再用电 ...

  5. nuget包重装

    Update-Package -Reinstall Update-Package -reinstall -ProjectName Cardin.HeartCare.Service.ChatServic ...

  6. XML文件(1)--使用DOM示例

    其他依赖字段/方法 // 书籍列表 private List<Book> bookList = new LinkedList<Book>(); /** * 根据xml文件,得到 ...

  7. coreseek+sphinx+mysql+thinkphp整合

    1.安装coreseek 1.1首先升级或安装系统依赖库 yum install make gcc g++ automake libtool mysql-client libmysqlclient15 ...

  8. mysql存储过程和存储函数

    mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...

  9. 4种scope方法

    默认作用域,自动加载: default_scope { order(created_at: :desc) } model 调用 find_2时才运行 scope :find_2, ->{ whe ...

  10. 第3月第19天 cxx_destruct dispatch_get_main_queue()死锁

    1. http://blog.jobbole.com/65028/ 2. - (void)viewDidLoad { [super viewDidLoad]; NSLog("); dispa ...