请求加强数据
查看原帖
请求加强数据
1118614
I_Love_DS楼主2024/10/12 17:04

这题数据太水了。。

#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 分的好成绩。。

综上所述,请求加强数据,造福美味的后人。

2024/10/12 17:04
加载中...