搜索专题总结


这周做了一部分搜索的题后,我发现这种题看似好像题目都差不多,但是其实写起来有可能有部分不同甚至是大相径庭。所以这周我想通过一道改了两天的题来总结一下。
回家
小 H 在一个划分成了 n \times mn×m 个方格的长方形封锁线上。 每次他能向上下左右四个方向移动一格(当然小 H 不可以静止不动), 但不能离开封锁线,否则就被打死了。 刚开始时他有满血 66 点,每移动一格他要消耗 11 点血量。一旦小 H 的血量降到 00, 他将死去。 他可以沿路通过拾取鼠标(什么鬼。。。)来补满血量。只要他走到有鼠标的格子,他不需要任何时间即可拾取。格子上的鼠标可以瞬间补满,所以每次经过这个格子都有鼠标。就算到了某个有鼠标的格子才死去, 他也不能通过拾取鼠标补满 HP。 即使在家门口死去, 他也不能算完成任务回到家中。
地图上有五种格子:
0:障碍物。
1:空地, 小 H 可以自由行走。
2:小 H 出发点, 也是一片空地。
3:小 H 的家。
4:有鼠标在上面的空地。
小 H 能否安全回家?如果能, 最短需要多长时间呢?
输入格式
第一行两个整数 n,mn,m, 表示地图的大小为 n \times mn×m。
下面 nn 行, 每行 mm 个数字来描述地图。
输出格式
一行, 若小 H 不能回家, 输出 -1,否则输出他回家所需最短时间。
第一遍核心搜索代码:
void run(int a, int b,int timee,int xie)
{
    if (timee >= n * m)return;
    if (xie == 0 || timee > minn)return;
    if (a<1 || a>n || b<1 || b>m)
    {
        return;
    }
    if (point[a][b] == 3)
    {
        if (timee < minn) minn = timee;
    }
    if (point[a][b] == 0)return;
    if (point[a][b] == 4)run(a, b, timee+1, 6);
    for (int i = 0; i < 4; i++)
    {
        int ax = a + x[i];
        int by = b + y[i];
        if (xie - 1 == 0)retu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值