AcWing 188. 武士風度的牛
阿新 • • 發佈:2022-03-02
#include <bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; #define x first #define y second typedef pair<int, int> PII; /* 不再是簡單的4連通或8連通,而是按中國象棋的“日”的方式去走! 日:共8個方向 K:起點,H:終點,*:障礙, .:可以跳 就是一個BFS最短路徑問題,關鍵在於如何跳“日”,其實本質還是dx8的引數配置問題了。 */ const int N = 155, M = N * N; int n, m; char g[N][N]; PII q[M]; int dist[N][N]; //距離陣列 // 8個方向 int dx[] = {-2, -1, 1, 2, 2, 1, -1, -2}; int dy[] = {1, 2, 2, 1, -1, -2, -2, -1}; int ans = INF; void bfs() { //初始化距離陣列為-1 memset(dist, -1, sizeof dist); //出發點座標 int sx, sy; //找出發點 for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) if (g[i][j] == 'K') sx = i, sy = j; //準備好佇列 int hh = 0, tt = -1; q[++tt] = {sx, sy}; 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 (g[a][b] == '*') continue; if (~dist[a][b]) continue; if (g[a][b] == 'H') { ans = dist[t.x][t.y] + 1; return; } dist[a][b] = dist[t.x][t.y] + 1; q[++tt] = {a, b}; } } } int main() { cin >> m >> n; //居然先輸入列數,再輸入行數,bt! for (int i = 0; i < n; i++) cin >> g[i]; bfs(); cout << ans << endl; return 0; }