这题数据太水了。。
#include <bits/stdc++.h>
using namespace std;
const int N = 555, dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, -1, 1};
int n, m;
char a[N][N];
int dist[N * N];
struct node {
int v, w;
};
vector <node> e[N * N];
set <pair <int, int>> q;
int id(int x, int y) {
return (x - 1) * m + y;
}
void dijkstra(int S, int E) {
// 没有清空堆 q
memset(dist, 127, sizeof(dist));
dist[S] = 0;
for (int i = 1; i <= n * m; i++) q.insert({dist[i], i});
for (; !q.empty(); ) {
int x = q.begin()->second;
if (dist[x] > 1 << 30 || x == E) break;
q.erase(q.begin());
for (auto i : e[x])
if (dist[x] + i.w < dist[i.v]) {
q.erase({dist[i.v], i.v});
dist[i.v] = dist[x] + i.w;
q.insert({dist[i.v], i.v});
}
}
if (dist[E] > 1 << 30) printf("-1\n");
else printf("%d\n", dist[E]);
}
bool solve() {
scanf("%d%d", &n, &m);
if (!n && !m) return 0;
for (int i = 1; i <= n; i++) scanf("%s", a[i] + 1);
// 没有清空邻接表 e
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
for (int k = 0; k < 4; k++) {
int sx = i + dx[k], sy = j + dy[k];
if (sx < 1 || sx > n || sy < 1 || sy > m) continue;
int u = id(i, j);
int v = id(sx, sy);
e[u].push_back({v, a[i][j] != a[sx][sy]});
}
int X1, X2, Y1, Y2;
scanf("%d%d%d%d", &X1, &Y1, &X2, &Y2);
dijkstra(id(X1 + 1, Y1 + 1), id(X2 + 1, Y2 + 1));
return 1;
}
int main() {
while (solve()) ;
return 0;
}
就连这样错漏百出的代码还能得到 80 分的好成绩。。
综上所述,请求加强数据,造福美味的后人。