BFS_Maze_求解迷宫最短路径
/*
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_求解迷宫最短路径的更多相关文章
- Java求解迷宫问题:栈与回溯算法
摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1) 选择一个 ...
- BFS求解迷宫的最短路径问题
题目:给定一个大小为N*M的迷宫,迷宫由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置.试求出起点到终点的最小步数.(本题假定迷宫是 ...
- 迷宫最短路径问题的dfs,bfs实现
迷宫的最短路径 给定一个大小为 N×M的迷宫.迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动.请求出从起点到终点所需的小步数.请注意,本题假定从起点一定可以移动到终点 限制条件:N,M ...
- 【数据结构】10分钟教你用栈求解迷宫老鼠问题超详细教程附C++源代码
问题描述 给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口.如下图所示: 该图是一个矩形区域,有一个入口和出口.迷宫内部包含不能穿越的墙壁或者障碍物.这些障碍物沿着行和列放置,与迷宫的边界 ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)求解迷宫问题
用下面这个简单的迷宫图作为例子: OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOXXOOOX XOOOOXOO XXXXXXXO O为通路,X为障碍物. ...
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...
- cdoj1088-王之迷宫 (三维迷宫最短路径)【BFS】
http://acm.uestc.edu.cn/#/problem/show/1088 王之迷宫 Time Limit: 3000/1000MS (Java/Others) Memory Li ...
- zoj1649-Rescue (迷宫最短路径)【bfs 优先队列】
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=649 Rescue Time Limit: 2 Seconds Mem ...
- 个人项目Individual Project:迷宫求解
源码的github链接: https://github.com/zhangxue520/test 1.1问题描述: a.问题描述:以一个m * n的长方阵表示迷宫,0和1分别表示迷 ...
随机推荐
- angular服务二
angular服务 $http 实现客户端与服务器端异步请求 get方式 test.html <!DOCTYPE html> <html lang="en"> ...
- Bzoj1076 [SCOI2008]奖励关
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1935 Solved: 1053 Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一 ...
- Python Day14
HTML HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏 ...
- Java学习笔记-Math类
并非所有的类都需要main方法.Math类和JOptionPane类都没有main方法.这些类中所包含的方法主要是为了供其他类使用. package welcome; public class Tes ...
- [Java] Maven 安装和配置
1. 下载 Maven 在百度输入 Maven 搜索 ,找到它的官网(http://maven.apache.org/),点击进入下载页面. 下载页面地址: http://maven.apache.o ...
- [Delphi] Delphi版本号对照
VER300 Delphi Seattle / C++Builder Seattle 23 230 (Delphi:Win32/Win64/OSX/iOS32/iOS64/An ...
- 遍历Map的方法
1.使用 entrySet() entrySet() --> 官方推荐将Map转换成Map.Entry对象的Set集合 Set entrys = map.entrySet(); Iterat ...
- SQL Server触发器
一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ...
- oracle DML(数据管理语言)sql 基本语句
- android 弹出AlertDialog的学习案例
我在编写的时候,测试的关键代码: AlertDialog.Builder builder=new AlertDialog.Builder(MainPointListActivity.this); bu ...