解救人质 DFS简单模板

解救人质,给一张二维地图,有障碍的点不能移动,给定起始点和人质坐标,求到达人质路程的最短路程,DFS模型
#include <iostream>
#include <cstdio>

using namespace std;
int n,m,p,q,Min=99999999;
int a[51][51],book[51][51];

void dfs(int x,int y,int step)
{
    int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//规定先向右,下,左,上
    int next_x,next_y,k;

    //判断是否到达小哈的位置
    if(x==p&&y==q){
        //更新最小值
        if(step<Min)
            Min=step;
        return ;
    }
    for(k=0;k<=3;k++){
        next_x=x+next[k][0];
        next_y=y+next[k][1];
        //判断是否越界
        if(next_x<1||next_x>n||next_y<1||next_y>m)
            continue;
        //判断改点是否为障碍物或者已经在路径中
        if(a[next_x][next_y]==0&&book[next_x][next_y]==0)
        {
            book[next_x][next_y]=1;//标记已走过
            dfs(next_x,next_y,step+1);//开始尝试下一个点
            book[next_x][next_y]=0;//想象下,在地图上,到头后开始回溯,取消标记
        }
    }
    return ;
}
int main()
{
    int i,j,start_x,start_y;
    cin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        cin>>a[i][j];
    cin>>start_x>>start_y>>p>>q;

    //从起点开始搜索
    book[start_x][start_y]=1;
    dfs(start_x,start_y,0);

    cout<<Min;
    return 0;
}


posted @ 2016-07-29 20:52  Lawliet__zmz  阅读(149)  评论(0编辑  收藏  举报