解救人质最小步数

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值