poj3984迷宫问题_迷宫代码

poj3984迷宫问题_迷宫代码POJ 3984 迷宫问题

大家好,又见面了,我是你们的朋友全栈君。

迷宫问题

定义一个二维数组: 


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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

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

Sample Output

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

本题的关键在于使用一维结构数组模拟的队列来保存符合要求的最短路径。
 1 #include <iostream>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 
 6 int maze[5][5];        //迷宫
 7 int visited[5][5];    //迷宫的访问状态
 8 int dx[4] = { 1,-1,0,0 };    //上下方向
 9 int dy[4] = { 0,0,1,-1 };    //左右方向
10 
11 struct node
12 {
13     int x, y;    //迷宫中的坐标(x,y)
14     int pre;    //(x,y)坐标的前驱
15 }q[100];    //模拟的队列
16 
17 int front = 0, rear = 1;    //front指向队首元素,rear指向队尾元素的下一个位置
18 
19 void print(int front)
20 {
21     if (q[front].pre != -1)        //这里并没有打印到起点
22     {
23         print(q[front].pre);    //使用递归进行逆序打印
24         printf("(%d, %d)\n", q[front].x, q[front].y);
25     }
26 }
27 
28 void bfs(int x, int y)
29 {
30     memset(visited, 0, sizeof(visited));    
31     visited[0][0] = 1;
32     q[0].x = x;
33     q[0].y = y;
34     q[0].pre = -1;
35 
36     while (front <= rear)    //队列不为空
37     {
38         if (q[front].x == 4 && q[front].y == 4)
39         {
40             print(front);
41             return;
42         }
43         for (int i = 0; i < 4; ++i)
44         {
45             int r = dx[i] + q[front].x;
46             int c = dy[i] + q[front].y;
47             if (r < 0 || c < 0 || r >= 5 || c >= 5 || maze[r][c] == 1 || visited[r][c])
48                 continue;
49 
50             visited[r][c] = 1;    //该点访问状态置为1
51 
52             //入队
53             q[rear].x = r;    
54             q[rear].y = c;
55             q[rear].pre = front;
56             ++rear;
57         }
58         ++front;    //队首元素出队
59     }
60     
61 }
62 
63 
64 
65 int main()
66 {
67     for (int i = 0; i < 5; ++i)
68         for (int j = 0; j < 5; ++j)
69             cin >> maze[i][j];
70 
71     cout << "(0, 0)" << endl;
72     bfs(0, 0);
73 
74 
75     return 0;
76 }

 

转载于:https://www.cnblogs.com/FengZeng666/p/10401627.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106998.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • arm与stm32的关系_STM32系列处理器常见型号与特性

    arm与stm32的关系_STM32系列处理器常见型号与特性ARM介绍1978年,奥地利籍物理学博士HermannHauser,和他朋友,一位英国工程师ChrisCurry,共同创建了一家名为“CambridgeProcessorUnit,CPU”的公司,中文字面意思就是“剑桥处理器单元”,主要从事研发当地电子仪器设备的业务,比如街头游戏机之类的。1979年,在经营逐渐进入正规后,原来的公司名不怎么合适了,那个年代喜欢找个吉祥物作为公司名字,比如Apple公司。这俩就以橡子为吉祥物,取名为“AcronComputer”,中文字面意思就是“橡果公

    2022年10月9日
    3
  • 同步调用、回调和异步调用区别

    同步调用、回调和异步调用区别同步调用是以一种阻塞式调用比如说:古代的长城的烽火传递信息,现在我们假设每个烽火只能看到相邻的烽火状态,每个烽火的状态只有亮和暗。现在有A、B、C、D四个烽火,A首先点亮,B看到A的烽火亮了,立马去点火,花了2秒点亮。但是这时候负责C烽火的人在睡觉,可是这时候所有人都在等待C点亮,终于C睡了2个小时候看到了B点亮,然后去点亮。D由于长期没有点亮,导致烽火出现问题,因此整个过程都在等待D的完

    2022年7月27日
    23
  • Springboot+Spring-Security+JWT 实现用户登录和权限认证「建议收藏」

    如今,互联网项目对于安全的要求越来越严格,这就是对后端开发提出了更多的要求,目前比较成熟的几种大家比较熟悉的模式,像RBAC基于角色权限的验证,shiro框架专门用于处理权限方面的,另一个比较流行的后端框架是Spring-Security,该框架提供了一整套比较成熟,也很完整的机制用于处理各类场景下的可以基于权限,资源路径,以及授权方面的解决方案,部分模块支持定制化,而且在和oauth2.0进…

    2022年4月11日
    79
  • 上传文件块client实现

    上传文件块client实现

    2022年1月7日
    50
  • Selenium2+python自动化48-登录方法(参数化)

    Selenium2+python自动化48-登录方法(参数化)

    2022年3月2日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号