解救人质,给一张二维地图,有障碍的点不能移动,给定起始点和人质坐标,求到达人质路程的最短路程,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;
}