迷宫全解
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写法:
以上是关于迷宫全解的主要内容,如果未能解决你的问题,请参考以下文章