迷宫问题(深搜 广搜)
Posted 小时のblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迷宫问题(深搜 广搜)相关的知识,希望对你有一定的参考价值。
题目描述:
给出一个m*n的迷宫图和一个入口,一个出口。
编一个程序,打印一条从迷宫入口到出口的路径。 -1表示走不通,0表示能走,只能上下左右走;
无路可走输出“no way”;
样例输入:
8 5
-1 -1 -1 -1 -1
0 0 0 0 -1
-1 -1 -1 0 -1
-1 0 0 0 -1
-1 0 0 1 -1
-1 0 0 0 -1
-1 -1 -1 0 -1
-1 0 0 0 -1
2 1
8 4
8 5
-1 -1 -1 -1 -1
0 0 0 0 -1
-1 -1 -1 0 -1
-1 0 0 0 -1
-1 0 0 -1 -1
-1 0 0 0 -1
-1 -1 -1 -1 -1
-1 0 0 0 -1
2 1
8 4
样例输出:你比着我的试试呗。。。。
【代码】
1 //深搜 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstdio> 5 using namespace std; 6 int n,m; 7 int mmap[100][100];//输入的迷宫 8 int a[100],b[100];//记录每一步的横纵坐标 9 int ckx,cky,rkx,rky,totstep,f;//出口x,y;入口x,y; 10 void dfs(int,int,int);//深搜 11 int main() 12 { 13 scanf("%d%d",&n,&m);//输出迷宫的大小 14 for(int i=1;i<=n;i++) 15 { 16 for(int j=1;j<=m;j++) 17 { 18 scanf("%d",&mmap[i][j]); 19 } 20 } 21 22 scanf("%d%d%d%d",&rkx,&rky,&ckx,&cky);//输入入口和出口坐标 23 dfs(rkx,rky,1);//从入口深搜,步数是1; 24 if(f)//如果能搜到输出步数 25 { 26 for(int i=1;i<=totstep;i++) 27 { 28 cout<<a[i]<<","<<b[i]<<endl; 29 } 30 } 31 else 32 printf("no way!"); 33 return 0; 34 } 35 void dfs(int x,int y,int step) 36 { 37 a[step]=x;b[step]=y;//第一步的x,y; 38 mmap[x][y]=1;//打标记 39 if(x==ckx&&y==cky)//到达终点 40 { 41 totstep=step; 42 f=1;//标记 43 } 44 else 45 { 46 if(y!=m&&mmap[x][y+1]==0)dfs(x,y+1,step+1);//能向右走 47 if((!f)&&x!=n&&mmap[x+1][y]==0)dfs(x+1,y,step+1);//没走到终点(因为找到一条路就可以了),可以向下走 48 if(!f&&x!=1&&mmap[x-1][y]==0)dfs(x-1,y,step+1);//向左走 49 if(!f&&y!=1&&mmap[x][y-1]==0)dfs(x,y-1,step+1);//向上走 50 } 51 } 52 //广搜 53 #include<iostream> 54 #include<cstdlib> 55 #include<cstdio> 56 using namespace std; 57 int qx,qy,zx,zy,n,m,f;//起点终点坐标,迷宫的大小和是否能走的标记 58 int mmap[100][100]; 59 int dx[4]={0,1,0,-1},//能走的方向 60 dy[4]={1,0,-1,0}; 61 int qque[100][4];//队列 62 int pre[100];//记录前驱 63 void bfs(); 64 void print(int); 65 int main() 66 { 67 scanf("%d%d",&n,&m); 68 for(int i=1;i<=n;i++) 69 for(int j=1;j<=m;j++) 70 scanf("%d",&mmap[i][j]); 71 scanf("%d%d%d%d",&qx,&qy,&zx,&zy); 72 bfs(); 73 if(!f) 74 printf("no way!"); 75 return 0; 76 } 77 void bfs() 78 { 79 int head=0,tail=1,step=1; 80 qque[1][1]=qx;qque[1][2]=qy; 81 do 82 { 83 head++; 84 for(int i=0;i<=3;i++)//寻找能走的位置 85 { 86 int x=qque[head][1]+dx[i], 87 y=qque[head][2]+dy[i]; 88 if(x>=1&&y>=1&&x<=n&&y<=m&&mmap[x][y]==0)//没有超过边界并且没有走过; 89 { 90 mmap[x][y]=1;//标记不能走 91 tail++;//入队 92 qque[tail][1]=x;qque[tail][2]=y; 93 pre[tail]=head;//记录前驱 94 if(x==zx&&y==zy)//到达终点输出 95 { 96 f=1; 97 print(tail); 98 break; 99 } 100 } 101 } 102 if(f)break; 103 }while(head<tail); 104 } 105 void print(int x) 106 { 107 if(pre[x]!=x) 108 print(pre[x]); 109 cout<<qque[x][1]<<","<<qque[x][2]<<endl; 110 }
如果是深搜,记录路径就是每一步的横纵坐标用数组记录就可以了
广搜路径就用记录前驱结点就可以了;
以上是关于迷宫问题(深搜 广搜)的主要内容,如果未能解决你的问题,请参考以下文章