解救小哈——dfs深搜

Posted boboyuzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解救小哈——dfs深搜相关的知识,希望对你有一定的参考价值。

问题描述:

小哈去玩迷宫,结果迷路了,小哼去救小哈。迷宫由n行m列的单元格组成(n和m都小于等于50),每个单元格要么是空地,要么是障碍物。

问题:帮小哼找到一条从迷宫的起点通往小哈所在位置的最短路径。(注意:障碍物不能走,小哼也不能走出迷宫外,0表示空地,1表示障碍物)

输入:

5 4

0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3

输出:

7

代码:

#include<cstdio>
#include<iostream>
#define INF 10000000
using namespace std;
int n,m,sx,sy,ex,ey,tx,ty;
int a[50][50],b[50][50];
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//四个方向
int minn=INF;

void dfs(int x,int y,int step)
{
    if(x==ex&&y==ey)
    {
        if(step<minn)
            minn=step;
        return ;
    }
    for(int i=0;i<4;i++)
    {
        tx=x+next[i][0];
        ty=y+next[i][1];
        if(ty<1||tx<1||ty>m||tx>n)//越界
        {
            continue;
        }
        if(b[tx][ty]==0&&a[tx][ty]==0)//这个位置没有走过并且是空地
        {
            b[tx][ty]=1;//标记
            dfs(tx,ty,step+1);
            b[tx][ty]=0;
        }
    }
    return ;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    scanf("%d%d%d%d",&sx,&sy,&ex,&ey);//起点和终点坐标
    b[sx][sy]=1;//最开始在起点位置,标记
    dfs(sx,sy,0);
    printf("%d
",minn);
    return 0;
}

 






以上是关于解救小哈——dfs深搜的主要内容,如果未能解决你的问题,请参考以下文章

解救小哈

啊哈算法第四章第二节解救小哈Java实现

11.17 dfs poj1979 Red and Black

dfs深搜

深搜(DFS),回溯,Fire Net

POJ 1321 深搜dfs