迷宫问题(深搜 广搜)

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 }

如果是深搜,记录路径就是每一步的横纵坐标用数组记录就可以了

广搜路径就用记录前驱结点就可以了;

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

深搜与广搜

4/6 深搜广搜专题+二分答案+单调队列

最短路问题------分别用深搜和广搜去解题

算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS

走迷宫

leetcode 深搜广搜