DFS 简单迷宫及路径打印

问题引入

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

《DFS 简单迷宫及路径打印》

问题分析

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

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

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

 《DFS 简单迷宫及路径打印》

 

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

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

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

《DFS 简单迷宫及路径打印》

#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("\n");
        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;
 } 

 

    原文作者:changfan
    原文地址: https://www.cnblogs.com/changfan/p/10541942.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞