#include <bits/stdc++.h>
using namespace std;
const int N = 1e2 + 5;
const int INF = 0x3f;
const int dx[] = {0, 0, -1, 1}, dy[] = {1, -1, 0, 0};
struct Node {
int x, y, w, col;
bool magic;
};
int m, n, x, y, c, ans = INF, g[N][N], f[N][N];
bool v[N][N];
bool operator < (Node x, Node y) {
return x.w > y.w;
}
int bfs(int x_1, int y_1, int x_2, int y_2) {
priority_queue<Node> q;
q.push({x_1, y_1, 0, g[1][1], true});
v[x_1][y_1] = false;
while (!q.empty()) {
Node qf = q.top();
q.pop();
int x = qf.x, y = qf.y, w = qf.w, col = qf.col;
bool magic = qf.magic;
if (x == x_2 && y == y_2) {
ans = min(ans, w);
}
for (int i = 0; i < 4; ++i) {
int mx = x + dx[i], my = y + dy[i];
if (mx >= 1 && my >= 1 && mx <= m && my <= m && v[mx][my]) {
v[mx][my] = false;
if (g[mx][my] == 0) {
if (magic) {
q.push({mx, my, w + 2, g[x][y], false});
}
} else {
if (col == g[mx][my]) {
q.push({mx, my, w, g[mx][my], true});
} else {
q.push({mx, my, w + 1, g[mx][my], true});
}
}
}
}
}
if (ans == INF) {
return -1;
} else {
return ans;
}
}
int main() {
memset(v, true, sizeof(v));
memset(g, 0, sizeof(g));
memset(f, 0, sizeof(f));
cin >> m >> n;
for (int i = 1; i <= n; ++i) {
cin >> x >> y >> c;
g[x][y] = c + 1;
}
cout << bfs(1, 1, m, m) << endl;
return 0;
}
我一开始写深搜,拿过 5 分,10 分,15 分。
然后后面开始写广搜,正常写法拿了 40 分,后面把队列改成了优先队列,拿了 45 分,后面又改了改,变成了现在的 65 分。
我觉得应该是有些条件没判断到,但是我又 DEBUG 不出来,请大佬们指点。