zoukankan      html  css  js  c++  java
  • DFS 迷宫问题

    题目大致描述:

    迷宫由n行m列的单元格组成(n,m都小于等于50)
    每个单元格要么是空地,要么是障碍物
    找到一条从起点到终点的最短路径长度
      1 /*
      2  * @Descripttion: 
      3  * @version: 
      4  * @Author: ZKYAAA
      5  * @Date: 2020-04-20 22:25:27
      6  * @LastEditors: 请叫我ZK谕啊啊啊
      7  * @LastEditTime: 2020-04-20 23:42:48
      8 
      9 *问题描述:
     10 *迷宫由n行m列的单元格组成(n,m都小于等于50)
     11 *每个单元格要么是空地,要么是障碍物
     12 *找到一条从起点到终点的最短路径长度
     13 
     14 5 4
     15 1 1 2 1 
     16 1 1 1 1
     17 1 1 2 1
     18 1 2 1 1
     19 1 1 1 2
     20 1 1 4 3
     21 */
     22 
     23 #include <bits/stdc++.h>
     24 using namespace std;
     25 const int MAXN=100;
     26 int p,q,Min=1e9,n,m;
     27 int a[MAXN][MAXN];      //1表示空地,2表示障碍物
     28 int vis[MAXN][MAXN];    //0表示未访问,1表示访问
     29 
     30 int dir[4][2]={
     31     {0,1},
     32     {1,0},
     33     {0,-1},
     34     {-1,0},
     35 };
     36 
     37 // int dirx[4]={0,1,0,-1};     //四个方向左下右上
     38 // int diry[4]={1,0,-1,0};
     39 
     40 void dfs(int x,int y,int step){
     41     if(x==p&&y==q){
     42         if(step<Min){
     43             Min=step;
     44         }
     45         return;         //往回回溯
     46     }
     47     //顺时针右下左上试探
     48     //优化代码
     49     for(int k=0;k<4;k++){
     50         // int dx=x+dirx[k];
     51         // int dy=y+diry[k];
     52         int dx=x+dir[k][0];
     53         int dy=y+dir[k][1];
     54         if(a[dx][dy]==1&&vis[dx][dy]==0){
     55             vis[dx][dy]=1;
     56             dfs(dx,dy,step+1);
     57             vis[dx][dy]=0;
     58         }
     59     }
     60     /*
     61     //右
     62     if(a[x][y+1]==1&&vis[x][y+1]==0)        //判断(x,y)的右边是否被访问且不是障碍物
     63     {
     64         vis[x][y+1]=1;
     65         dfs(x,y+1,step+1);
     66         vis[x][y+1]=0;                      //dfs执行后回溯到这个点,标记未访问,继续找step
     67     }
     68     //下
     69     if(a[x+1][y]==1&&vis[x+1][y]==0)        //判断(x,y)的下边是否被访问且不是障碍物
     70     {
     71         vis[x+1][y]=1;
     72         dfs(x+1,y,step+1);
     73         vis[x+1][y]=0;                      //dfs执行后回溯到这个点,标记未访问,继续找step
     74     }
     75     //左
     76     if(a[x-1][y]==1&&vis[x-1][y]==0)        //判断(x,y)的左边是否被访问且不是障碍物
     77     {
     78         vis[x-1][y]=1;
     79         dfs(x-1,y,step+1);
     80         vis[x-1][y]=0;                       //dfs执行后回溯到这个点,标记未访问,继续找step
     81     }
     82     //上
     83     if(a[x][y-1]==1&&vis[x][y-1]==0)        //判断(x,y)的上边是否被访问且不是障碍物
     84     {
     85         vis[x][y-1]=1;
     86         dfs(x,y-1,step+1);
     87         vis[x][y-1]=0;                       //dfs执行后回溯到这个点,标记未访问,继续找step
     88     }
     89    */
     90     return;                                 //回退
     91 }
     92 
     93 int main(){
     94     int startx,starty;
     95     memset(vis,0,sizeof(vis));
     96     cin>>m>>n;
     97     //一开始写为先n后m创建一个迷宫,一直出错运行为5
     98     for(int i=1;i<=m;i++)
     99         for(int j=1;j<=n;j++)
    100             cin>>a[i][j];
    101     cin>>startx>>starty>>p>>q;
    102     vis[startx][starty]=1;
    103     dfs(startx,starty,0);
    104     cout<<Min;
    105     return 0;
    106 }
  • 相关阅读:
    【ST开发板评测】Nucleo-F411RE开箱报告
    手把手教你制作Jlink-OB调试器(含原理图、PCB、外壳、固件)
    国产处理器的逆袭机会——RISC-V
    基于uFUN开发板和扩展板的联网校准时钟
    基于uFUN开发板的RGB调色板
    理解ffmpeg中的pts,dts,time_base
    如何终止线程的运行(C/C++)
    关于阻塞和非阻塞,同步和异步的总结
    QT移植无法启动 This application failed to start because it could not find or load the QT platform
    Qt5学习记录:QString与int值互相转换
  • 原文地址:https://www.cnblogs.com/ZKYAAA/p/12741574.html
Copyright © 2011-2022 走看看