基本全部RE,双向广搜+二进制状压求条
查看原帖
基本全部RE,双向广搜+二进制状压求条
1391415
CCFoier楼主2025/7/27 12:57
#include <bits/stdc++.h>

using namespace std;
const int N = (1 << 15) + 10;
int s, st, ed, vis[N], dis[N];
int dx[4][2] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
char c;
int expand(queue <int> & q, int mk) {
	int t = q.front(); q.pop();
	for (int p = 0; p < 16; p++) {
		if (t & (1 << p)) {
			int px = p / 4, py = p % 4;
			for (int i = 0; i < 4; i++) {
				int nx = px + dx[i][0], ny = py + dx[i][1];
				if (nx < 0 || nx >= 4 || ny < 0 || ny >= 4) continue;
				int np = nx * 4 + ny, nt = t;
				if (t & (1 << np)) continue;
				nt ^= (1 << i), nt ^= (1 << np);
				if (!vis[nt]) {
					dis[nt] = dis[t] + 1;
					vis[nt] = mk;
					q.push(nt);
				}
				else if (vis[nt] != mk) return dis[t] + dis[nt] + 1;
			}				
		}	
	}
	return -1;
}
int bfs() {
	queue <int> q1, q2;
	q1.push(st), q2.push(ed);
	vis[st] = 1, vis[ed] = -1;
	while (q1.size() && q2.size()) {
		int res = (q1.size() < q2.size() ? expand(q1, 1) : expand(q2, -1));
		if (res != -1) return res;
	}
	return -1;
}

int main() {
	for (int i = 1 << 15; i; i >>= 1) {
		cin >> c;
		st += (c - '0') * i;
	}
	for (int i = 1 << 15; i; i >>= 1) {
		cin >> c;
		ed += (c - '0') * i;
	}
	if (st == ed) {
		cout << 0;
		return 0;
	}
	cout << bfs() << '\n';
	return 0;
}
2025/7/27 12:57
加载中...