定义一个二维数组:


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<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 #include<iostream>
5 #include<queue>
6 using namespace std;
7 struct shu
8 {
9 int y,x,step;
10 }str1,str2;
11 int a,s,d,f,g,q[10][10],v[10][10],w[10][10],z[25],c[25];
12 int p[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
13 void bfs()
14 {
15 int xx,yy,x,y;
16 queue<shu>r;
17 r.push(str1);
18 while(!r.empty())
19 {
20 str1=r.front();
21 r.pop();
22 if(str1.y==4 && str1.x==4)
23 {
24 xx=q[str1.y][str1.x]%10;
25 yy=(q[str1.y][str1.x]-xx)/10;
26 while(1) //while循环找寻路径
27 {
28 z[g]=yy;c[g]=xx;
29 g++;
30 if(q[yy][xx]==0)
31 {
32 break;
33 }
34 x=q[yy][xx]%10; //找到这一个点的前一个点的坐标(因为我们之前维护过,所以用同样方式找寻点坐标)
35 y=(q[yy][xx]%100-x)/10;
36 yy=y;
37 xx=x;
38 }
39 while(!r.empty())
40 r.pop();
41 return;
42 }
43 str2.step=str1.step+1;
44 for(int i=0;i<4;++i)
45 {
46
47 str2.y=str1.y+p[i][1];
48 str2.x=str1.x+p[i][0];
49 if(str2.y<0 || str2.x<0 || str2.y>=5 || str2.x>=5) continue;
50 if(v[str2.y][str2.x]==0 && w[str2.y][str2.x]==0)
51 {
52 q[str2.y][str2.x]=str1.y*10+str1.x; //把它的前一个点的坐标维护成一个唯一值
53 w[str2.y][str2.x]=1;
54 r.push(str2);
55 /*
56 除了这一种方式之外,我们还可以定义一个结构体专门保存上一个点的坐标
57
58 */
59 }
60 }
61 }
62 }
63 int main()
64 {
65 g=0;
66 for(int i=0; i<5;++i)
67 {
68 for(int j=0; j<5 ;++j)
69 {
70 scanf("%d",&v[i][j]);
71 }
72 }
73 q[0][0]=0;
74 str1.x=0;
75 str1.y=0;
76 str1.step=0;
77 w[0][0]=1;
78 bfs();
79 printf("(0, 0)\n");
80 for(int i=g-1;i>=0;--i)
81 {
82 printf("(%d, %d)\n",z[i],c[i]);
83 }
84 printf("(4, 4)\n");
85 return 0;
86 }

最新文章

  1. javase--&gt;多线程--线程池
  2. 如何指定个别属性进行transition过渡
  3. 缓存篇(Cache)~第二回 使用static静态成员实现服务器端缓存(导航面包屑)~续
  4. 【IOS基础知识】NSTimer定时器使用
  5. 【LeetCode】8. String to Integer (atoi) 字符串转整数
  6. CSS框架分析与网站的CSS架构
  7. Linux下的简单好用的计算器bc
  8. HDU-1049
  9. 6个最佳的开源Python应用服务器
  10. Scrum Meeting Alpha - 2
  11. JSP标签c:forEach实例
  12. ISLR系列:(4.1)模型选择 Subset Selection
  13. 死磕 java集合之ConcurrentHashMap源码分析(二)——扩容
  14. 【翻译】JavaScript中5个值得被广泛使用的数组方法
  15. MySQLi面向对象实践--insert、update、delete
  16. shell 通配符
  17. centos 7 安装 mysql 5.7
  18. 推荐一款不错的TP5开源是CMS
  19. vue--自定义指令进行验证(1)
  20. ASP.NET CMS: Administration Template

热门文章

  1. windows打包脚本出现 /bin/sh^M: 坏的解释器: 没有那个文件或目录 错误
  2. 【System】paging和swaping之间的区别是什么?
  3. 小白的经典CNN复现(二):LeNet-5
  4. guava eventbus 原理+源码分析
  5. Eureka详解系列(二)--如何使用Eureka(原生API,无Spring)
  6. C#高级编程第11版 - 第五章 索引
  7. 标准PE头属性说明
  8. Scalable Go Scheduler Design Doc
  9. Update Node Using a Package Manager nodesource
  10. LDAP学习