36pts,代码求条
查看原帖
36pts,代码求条
1070982
Guoguo2013楼主2024/7/26 22:49
#include<bits/stdc++.h>
#define int long long
#define PII pair< int, int >
#define MII map< int, int >
#define MIB map< int, bool >

using namespace std;

const int N = 5e2 + 5, mod = 998244353;
int h[N * N * 4], e[N * N * 4], ne[N * N * 4], w[N * N * 4], idx;
int n, m, fx[4][2] = {-1, -1, -1, 1, 1, 1, 1, -1};
char c[N][N];
int dis[N * N * 4];
bool s[N];

int bh(int x, int y){ return (x-1) * (m+1) + y; }
int dij(){
	for (int i = 1; i <= 1000000; i++) dis[i] = 9;
	memset(s, false, sizeof s);
	priority_queue< PII > q;
	dis[1] = 0;
	q.push({0, 1});
	while (!q.empty()){
		int t = q.top().second;
		q.pop();
		if (s[t]) continue;
		s[t] = true;
		for (int i = h[t]; ~i; i = ne[i]){
			int j = e[i];
			if (dis[j] > dis[t] + w[i]){
				dis[j] = dis[t] + w[i];
				q.push({-dis[j], j});
			}
		}
	}
	return dis[bh(n + 1, m + 1)];
}
void add(int u, int v, int wi){
	e[idx] = v;
	ne[idx] = h[u];
	w[idx] = wi;
	h[u] = idx++;
	e[idx] = u;
	ne[idx] = h[v];
	w[idx] = wi;
	h[v] = idx++;
}
signed main(){
//	freopen("a.in", "r", stdin);
//	freopen("a.out","w",stdout);
	scanf("%lld %lld", &n, &m); 
	if (n + m & 1){
		printf("NO SOLUTION");
		return 0;
	}
	memset(h, -1, sizeof h);
	idx = 1;
	for (int i = 1; i <= n; i++){
		for (int j = 1; j <= m; j++){
			cin >> c[i][j];
			for (int k = 0; k < 2; k++){
				int x = i + fx[k][0], y = j + fx[k][1];
				if (x < 1 || x > n + 1 || y < 1 || y > m + 1) continue;
				if (k % 2){
					if (c[i][j] == '/') add(bh(x, y), bh(i, j), 0);
					else add(bh(x, y), bh(i, j), 1);
				}
				else {
					if (c[i][j] == '\\') add(bh(x, y), bh(i, j), 0);
					else add(bh(x, y), bh(i, j), 1);
				}
			}
			if (i == n || j == m){
				for (int k = 2; k < 4; k++){
					int x = i + fx[k][0], y = j + fx[k][1];
					if (x < 1 || x > n + 1 || y < 1 || y > m + 1) continue;
					if (k % 2){
						if (c[i][j] == '/') add(bh(x, y), bh(i, j), 0);
						else add(bh(x, y), bh(i, j), 1);
					}
					else {
						if (c[i][j] == '\\') add(bh(x, y), bh(i, j), 0);
						else add(bh(x, y), bh(i, j), 1);
					}
				}
			}
		}
	}
	printf("%lld\n", dij());
	return 0;
}

其他的全 WA 了。

2024/7/26 22:49
加载中...