zoukankan      html  css  js  c++  java
  • DFS 简单迷宫及路径打印

    问题引入

    有一天,小哈一个人去玩迷宫。但是方向感不好的小哈很快就迷路了。小哼得知后便去解救无助的小哈。此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈。那么,问题来了...

    问题分析

    1首先我们用一个二维数组来存储这个迷宫,刚开始的时候,小哼处于迷宫的入口处(1,1),小哈在(p,q)。其实这道题的的本质就在于找从(1,1)到(p,q)的最短路径。

    此时摆在小哼面前的路有两条,我们可以先让小哼往右边走,直到走不通的时候再回到这里,再去尝试另外一个方向。

    在这里我们规定一个顺序,按照顺时针的方向来尝试(即右→下→左→上)。

     

    2我们先来看看小哼一步之内可以到达的点有哪些?只有(1,2)和(2,1)。

    根据刚才的策略,我们先往右边走,但右边(1,3)有障碍物,所以只能往下(2,2)这个点走。但是小哈并不在(2,2)这个点上,所以小哼还得继续往下走,直至无路可走或者找到小哈为止。

    注意:并不是让我们找到小哈此题就解决了。因为刚才只是尝试了一条路的走法,而这条路并不一定是最短的。刚才很多地方在选择方向的时候都有多种选择,因此我们需要返回到这些地方继续尝试往别的方向走,直到把所有可能都尝试一遍,最后输出最短的一条路径。

    #include<stdio.h>
    int m,n,p,q;
    
    int next[4][2],book[51][51],book1[51],book2[51],a[51][51];
    int min=99999;
    
    void dfs(int x,int y,int step)
    {
        int tx,ty,k,j;
        if(x == p && y == q)
        {
            if(step<min)
                min = step;
            
            for(j=0;j<step;j++)
                printf("(%d %d) ",book1[j],book2[j]);
            printf("
    ");
            return;
        }
        
        int next[4][2]=    {
            {0,1},    //右走 
            {1,0},    //下走 
            {0,-1},    //左走 
            {-1,0},    //上走 
        };
        for(k=0;k<=3;k++)
        {
            tx = x + next[k][0];
            ty = y + next[k][1];
         
            if(tx>n||ty>m||tx<1||ty<1)
                continue;
            
            if(a[tx][ty]==0 && book[tx][ty]==0)
            {
                book1[step] = tx;
                book2[step] = ty; 
                book[tx][ty] = 1;
                dfs(tx,ty,step+1);
                book[tx][ty] = 0;
            }
        }
        return;    
    }
    
    
    int main()
    {
        int i,j,startx,starty;
        scanf("%d %d",&n,&m);
        
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        
        scanf("%d %d %d %d",&startx,&starty,&p,&q);
        
        book[startx][starty] = 1;
        
        dfs(startx,starty,0);
        
        printf("%d",min);
        return 0;
     } 
    非学无以广才,非志无以成学。 正是因为今天的不完美,才对未来充满希望。 ----长帆
  • 相关阅读:
    vue store获取值时 Computed property "activeTag" was assigned to but it has no setter.
    深拷贝实现方法以及问题
    mac 中git操作账号的保存与删除
    解决Ubuntu编译内核uImage出现问题“mkimage” command not found
    ubuntu修改主机名后无法解析主机
    多行宏定义中的注释问题
    uboot启动阶段修改启动参数方法及分析
    ubuntu nfs服务器配置
    mount/umount命令详解
    Ubuntu下vsftp安装和配置
  • 原文地址:https://www.cnblogs.com/changfan/p/10541942.html
Copyright © 2011-2022 走看看