#include<stdio.h>
int n,m,p,q,min = 99999999;
int a[51][51],book[51][51];
void dfs(int x,int y,int step)
{
int d[4][2] = { {0,1},{1,0},{0,-1},{-1,0} };
int dx,dy,k;
if(x == p && y == q)
{
if(step < min) min = step; // 一旦找到人质 ,更新最小值
return ; // 很重要
}
for(k = 0; k <= 3; k++)
{
dx = x + d[k][0];
dy = y + d[k][1];
if(dx >= 1 && dx <= n && dy >= 1 && dy <= n)
{
if(a[dx][dy] == 0 && book[dx][dy] == 0)
{
book[dx][dy] = 1; // 标记这个点已经走过
dfs(dx,dy,step + 1);
book[dx][dy] = 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; // 标记已经在路径中,防止后面重复走
//第一个参数是起点的坐标,第二个参数是起点的坐标,第三个参数是初始化步数为0
dfs(startx,starty,0);
printf("%d\n",min);
return 0;
}
解救人质最小步数
最新推荐文章于 2020-04-19 19:04:47 发布