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;
     } 
    非学无以广才,非志无以成学。 正是因为今天的不完美,才对未来充满希望。 ----长帆
  • 相关阅读:
    Android开发中适配多种 ROM 的快捷方式是如何实现的?
    Android开发利用Volley框架下载和缓存网络图片
    Android调用系统相机、自定义相机、处理大图片
    Excel中MATCH函数的正确使用
    Excel中INDEX函数的使用
    (转)Delphi2009初体验
    利用NSA的MS17-010漏洞利用工具实现Win 7和Win Server 2008系统入侵
    delphi 的结构体对齐关键字
    KVM虚拟化(一)—— 介绍与简单使用
    kvm虚拟化学习笔记(四)之kvm虚拟机日常管理与配置
  • 原文地址:https://www.cnblogs.com/changfan/p/10541942.html
Copyright © 2011-2022 走看看