迷宫全解

Posted tflsnoi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迷宫全解相关的知识,希望对你有一定的参考价值。

相关题连接:

一本通:http://ybt.ssoier.cn:8088/problem_show.php?pid=1215 

小白菜OJ:http://caioj.cn/problem.php?id=1037

 

 

一、DFS写法:

问题一:迷宫是否能走通?(http://ybt.ssoier.cn:8088/problem_show.php?pid=1215 

 

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 int n;
 5 char a[200][200]={0};//用于存放迷宫数据,.为可走,#为不可走 
 6 int book[200][200];//用于标记该点是否被访问,0为未被访问,1为已经访问 
 7 int next[4][2]={{0,-1},{-1,0},{0,1},{1,0}};//存储下一步坐标累加数 
 8 int stx, sty, edx, edy;//分别代表迷宫初始位置、目标位置坐标 
 9 bool f;//标记迷宫是否能走通 
10 void dfs(int x, int y)
11 {
12     //如果到达目标坐标,则打印输出,递归出口 
13     if(x==edx&&y==edy) {
14         f=true;
15     }
16     //尝试四方向的邻居坐标 
17     for(int i=0; i<4; i++)
18     {
19         //计算下一个点的坐标 
20         int nx=x+next[i][0];
21         int ny=y+next[i][1];
22  
23         if(nx<0 || nx>n-1 || ny<0 || ny>n-1) continue;//判断是否越界
24         if(book[nx][ny]==0 && a[nx][ny]==.)
25         {
26             book[nx][ny]=1;//试探 
27             dfs(nx, ny);
28             //book[nx][ny]=0;//回溯 注意此处不需要回溯,否则就会超时
29         } 
30     } 
31 }
32 int main()
33 {
34     int k;
35     scanf("%d",&k);
36     while(k--)
37     {
38         f=false;//刚开始假定迷宫走不通
39         memset(book,0,sizeof(book)); //book初始化为0 
40         scanf("%d",&n);
41         for(int i=0; i<n; i++)
42         for(int j=0; j<n; j++)
43             scanf(" %c",&a[i][j]);//特别注意这个地方%c前有个空格 原因:https://blog.csdn.net/hx1043116928/article/details/79736723 
44         scanf("%d%d",&stx,&sty);
45         scanf("%d%d",&edx,&edy);
46         book[stx][sty]=1;//设定初始值为不可访问,避免形成回路 
47         dfs(stx,sty); //从出发点开始,第一步走起 
48     
49         if(!f)printf("NO
");
50         else printf("YES
");   
51     }
52     return 0;
53 }

 

 

 

问题二:有多少种走法?

 

问题三:输出每条走法?

 

问题四:输出最短路径数?(http://bbs.codeaha.com/problem-12032.html

 

 1 #include <cstdio>
 2 int a[51][51],book[51][51];
 3 int next[4][2]= {{0,-1},{-1,0},{0,1},{1,0}};//这里一定要和数学上的坐标进行区分,x,y分别代表行和列
 4 int n, m;//n行m列迷宫 
 5 int min=999999999;//用于存放最短步数,并设定min初始值为一个较大值 
 6 int stx,sty,edx,edy;//分别代表迷宫初始位置、目标位置坐标
 7 bool f=false;//刚开始假定迷宫走不通 
 8 void dfs(int x,int y,int step) {
 9     int nx,ny;//---->>>>注意这一行一定只能写在dfs内<<<<<----- 
10     if(x==edx&&y==edy) {
11         f=true;
12         if(step<min) {
13             min=step;
14         }
15         return ;//判断边界的返回不能丢
16     }
17     for(int i=0; i<=3; i++) {
18         nx=x+next[i][0];
19         ny=y+next[i][1];
20         if(nx<1||nx>n||ny<1||ny>m) {//判断是否越界
21             continue;
22         }
23         if(book[nx][ny]==0&&a[nx][ny]==0) {
24             book[nx][ny]=1;
25             dfs(nx,ny,step+1);
26             book[nx][ny]=0;//收回不能丢
27         }
28     }
29 }
30 int main() {
31     scanf("%d%d",&n,&m);
32     for(int i=1; i<=n; i++) {
33         for(int j=1; j<=m; j++) {
34             scanf("%d",&a[i][j]);
35         }
36     }
37     scanf("%d%d%d%d",&stx,&sty,&edx,&edy);
38     book[stx][sty]=1;//这里就和全排列有点不一样,因为这里进去之后就要发生改变,而全排列进去之后不改变
39     dfs(sty,sty,0);
40     if(!f)printf("No Way!");
41     else printf("%d
",min);
42     return 0;
43 }

 

二、BFS写法:

 

以上是关于迷宫全解的主要内容,如果未能解决你的问题,请参考以下文章

帆布迷宫游戏流畅的动画

XDCTF2015代码审计全解

GIS风暴GeoJSON数据格式案例全解

MP3文件格式全解

python 全解坦克大战 辅助类 附完整代码雏形

含泪提速!一文全解相似度算法跟踪算法在各个AI场景的应用(附代码)