难度:普及

题目类型:BFS

提交次数:2

涉及知识:BFS

描述

定义一个二维数组:

int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

输入一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。输出左上角到右下角的最短路径,格式如样例所示。样例输入

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

样例输出

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

代码:

 1 #include<iostream>
 2 #include<queue>
 3 #include<cstring>
 4 #include<stack>
 5 using namespace std;
 6 int maze[6][6];
 7 struct node{
 8     int x, y, step;
 9 };
10 queue<node>q;
11 bool visited[5][5];
12 int dirx[4] = {1, 0, -1, 0};
13 int diry[4] = {0, 1, 0, -1};
14 node way[6][6];
15 stack<node> w;
16
17 int main(){
18     int i, j;
19     for(i = 1; i <= 5; i++)
20         for(j = 1; j <= 5; j++){
21             cin>>maze[i][j];
22             if(maze[i][j] == 0)
23                 maze[i][j] = 2;
24         }
25     node p;
26     p.x = 1;
27     p.y = 1;
28     p.step = 0;
29     q.push(p);
30     visited[1][1] = true;
31     while(!q.empty()){
32         p = q.front();
33         q.pop();
34         if(p.x == 5&&p.y == 5){
35             while(1){
36                 w.push(p);
37                 if(p.x==1&&p.y==1)
38                     break;
39                     p = way[p.x][p.y];
40             }
41             while(!w.empty()){
42                 p = w.top();
43                 cout<<"("<<p.x-1<<", "<<p.y-1<<")"<<endl;
44                 w.pop();
45             }
46             return 0;
47         }
48         for(i = 0; i < 4; i++){
49             int nx = p.x+dirx[i];
50             int ny = p.y+diry[i];
51             if(!visited[nx][ny]&&maze[nx][ny]==2){
52                 node no;
53                 no.x = nx;
54                 no.y = ny;
55                 no.step = p.step+1;
56                 q.push(no);
57                 way[nx][ny] = p; //记录前驱结点
58                 visited[nx][ny] = true;
59             }
60         }
61     }
62     return 0;
63 }

备注:

BFS没什么好说的。用way这个二维数组记录一下前驱结点,然后走到终点的时候回溯。有一个地方当时想了一下:way里一定记录的是最短路径上的前驱结点。因为每个结点只访问一次,最短路径上的一定是先访问到的。

转载于:https://www.cnblogs.com/fangziyuan/p/6562158.html

BDFZOI 迷宫问题相关推荐

  1. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  2. hdu 1272 小希的迷宫

    Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该 ...

  3. C语言通路寻找,用C语言解决迷宫问题设计与寻找通路问题.pdf

    用c语言解决迷宫设计与寻找通路问题 摘 要:本课程设计主要解决设计一个迷宫以及在给出一组入口和出口的情况下,求出一条通路的问题.在课程 设计中,程序设计语言采用VisualC++6.0,数据结构采用顺 ...

  4. java栈 迷宫_利用栈实现迷宫的求解

    问题描述:这时实验心理学中的一个典型的问题,心理学家吧一只老鼠从一个无顶的大盒子的入口处赶进迷宫.迷宫设置很多隔壁,对前进方向形成了许多障碍,心理学家在迷宫的唯一出口处放置了一块奶酪,吸引老鼠仔迷宫中 ...

  5. python迷宫问题求最短路径_用栈求解迷宫问题的所有路径及最短路径程序

    目的:能将栈运用的更为熟练 实验内容:求解迷宫问题程序,要求输出如图所示的迷宫的路径,并求出第一条最短路径的长度以及最短路径. 设计的算法功能: mgpath(int xi,int yi,int xe ...

  6. 用栈、回溯算法设计迷宫程序

    目录 1.走迷宫与回溯算法 2.迷宫设计栈扮演的角色 3.Python实现走迷宫 栈的应用有许多,本篇博文着重将栈与回溯(Backtracking)算法结合,设计走迷宫程序.其实回溯算法也是人工智能的 ...

  7. 不相交集类以及应用迷宫生成

    简单介绍: 考虑一个迷宫的生成,一个简单算法就是从各处的墙壁开始(除入口和出口之外).此时,不断地随机选择一面墙,如果被该墙分割的单元彼此不联通,那么就把这面墙拆掉.重复这个过程直到开始单元和终止单元 ...

  8. 深度优先搜索算法在RPG游戏迷宫中的应用

    在RPG游戏中我们经常会看到一些迷宫,我之前玩仙剑一的时候就经常在几个迷宫里绕来绕去也绕不出来,玩仙三由于游戏视角可以转,更是费劲.这里我们使用深度优先算法达到遍历一个迷宫的目的. 首先定义一个有序元 ...

  9. 基础数据结构【三】————老鼠走迷宫问题————堆栈应用

    假设:老鼠在一个二维地图中i行走,地图中大部分路径被墙阻断,无法前进.老鼠可以按照尝试错误的方法找到出口.只是,这只老鼠必须具备走错路时候就退回来,并且把走过的路记下来,避免下次走重复路,知道找到出口 ...

最新文章

  1. 数据库架构的升级和变更
  2. 对公平席位分配问题的探讨:最大余数法、Q值法和D’Hondt方法及其特例|公平分配原则等
  3. Python - SIP参考指南 - 介绍
  4. HTML5 自由画布
  5. vue中的provide/inject的学习使用
  6. C++ 从入门到入土(English Version)Section 6: Pointers and Call by Reference
  7. 用CSS实现一个易于换肤的移动导航栏
  8. 激光SLAM之Cartographer源码解析视频课程
  9. redistemplate 设置永不过期_解决密码已过期,拒绝访问问题
  10. 洛谷 1984 [SDOI2008]烧水问题
  11. 第三章 最速下降法和牛顿法
  12. java 序列号怎么获取,Java获得硬盘和主板的序列号代码
  13. 详解百度地图API之驾车导航
  14. 不要去深圳小梅沙海洋世界
  15. 为promise增加abort功能
  16. New Year Snowmen((贪心)map+优先队列)
  17. http协议 服务器主动下发,HTTP协议快速入门指南
  18. 阿里云服务器发送邮件
  19. 3、Spring Bean生命周期
  20. 地理总结(三)--川南川北川东川西划分

热门文章

  1. 小红的真真假假签到题题(构造+思维)
  2. android 线程池 阻塞队列,【Android框架进阶〖02〗】ThinkAndroid线程池机制
  3. c语言哈希表电子辞典_C语言实现的哈希表实现程序
  4. pySpark | pySpark.Dataframe使用的坑 与 经历
  5. 关于Win32 DialogBox的一些收获
  6. npm install socket.io 提示缺少VCBuild.exe
  7. 简单的redis使用watch完成秒杀抢购功能
  8. 制作JD的手动和自动轮播图片板块
  9. cvc-complex-type.2.3: Element 'beans' cannot have character [children]
  10. 检查最后出现子字符串的位置!