AcWing 188. 武士风度的牛(搜索)

题目链接


题目描述

农民 John 有很多牛,他想交易其中一头被 Don 称为 The Knight 的牛。
这头牛有一个独一无二的超能力,在农场里像 Knight 一样地跳(就是我们熟悉的象棋中马的走法)。
虽然这头神奇的牛不能跳到树上和石头上,但是它可以在牧场上随意跳,我们把牧场用一个 x,y 的坐标图来表示。
这头神奇的牛像其它牛一样喜欢吃草,给你一张地图,上面标注了 The Knight 的开始位置,树、灌木、石头以及其它障碍的位置,除此之外还有一捆草。
现在你的任务是,确定 The Knight 要想吃到草,至少需要跳多少次。
The Knight 的位置用 K 来标记,障碍的位置用 * 来标记,草的位置用 H 来标记。


题目代码

#include <iostream>
#include <cstring>
#include <algorithm>

#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

const int N = 155, M = N * N;

int n, m;
char g[N][N];
PII q[M];
int dist[N][N];

int bfs()
{
    int dx[] = {-2, -1, 1, 2, 2, 1, -1, -2};
    int dy[] = {1, 2, 2, 1, -1, -2, -2, -1};
    
    int sx, sy;
    for(int i = 0; i < n; i ++ )
        for(int j = 0; j < n; j ++ )
            if(g[i][j] == 'K')
                sx = i, sy = j;
    
    int hh = 0, tt = 0;
    q[0] = {sx, sy};
    
    memset(dist, -1, sizeof dist);
    dist[sx][sy] = 0;
    
    while(hh <= tt)
    {
        PII t = q[hh ++ ];
        for(int i = 0; i < 8; i ++ )
        {
            int a = t.x + dx[i], b = t.y + dy[i];
            if(a < 0 || a >= n || b < 0 || b >= m) continue;
            if(dist[a][b] != -1) continue;
            if(g[a][b] == '*') continue;
            if(g[a][b] == 'H') return dist[t.x][t.y] + 1;
            
            dist[a][b] = dist[t.x][t.y] + 1;
            q[ ++ tt] = {a, b};
        }
    }
    
    return -1;
}

int main()
{
    cin >> m >> n;
    for(int i = 0; i < n; i ++ ) cin >> g[i];
    
    cout << bfs() << endl;
    
    return 0;
}
posted @ 2022-07-12 10:44  esico  阅读(34)  评论(0)    收藏  举报