zoukankan      html  css  js  c++  java
  • 迷宫问题(深搜 广搜)

    题目描述:

    给出一个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 }

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

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

  • 相关阅读:
    PAT Advanced 1138 Postorder Traversal (25) [树的遍历,前序中序转后序]
    PAT Advanced 1127 ZigZagging on a Tree (30) [中序后序建树,层序遍历]
    PAT Advanced 1020 Tree Traversals (25) [⼆叉树的遍历,后序中序转层序]
    PAT Basic 1075 链表元素分类(25) [链表]
    PAT A1133 Splitting A Linked List (25) [链表]
    PAT Advanced 1097 Deduplication on a Linked List (25) [链表]
    PAT Basic 反转链表 (25) [链表]
    PAT Advanced 1074 Reversing Linked List (25) [链表]
    PAT Advanced 1052 Linked List Sorting (25) [链表]
    PAT Advanced 1032 Sharing(25) [链表]
  • 原文地址:https://www.cnblogs.com/zzyh/p/6651910.html
Copyright © 2011-2022 走看看