60pts求助
  • 板块P5507 机关
  • 楼主incra
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/1/10 17:31
  • 上次更新2023/10/24 04:51:47
查看原帖
60pts求助
463956
incra楼主2023/1/10 17:31

60pts,#5#6WA,#8#10TLE

代码:(参考第一篇题解的代码)

#include <iostream>
#include <queue>
using namespace std;
typedef pair <double,int> PDI;
const int N = 25,M = 1 << N;
int start;
int g[N][4];
int dist[M];
bool st[M];
int pre[M],op[M];
double f (int state) {
	double ans = 0;
	for (int i = 0;i < 12;i++) ans += (4 - state >> (2 * i) & 3) & 3;
	return ans / 2;
}
int A_star () {
	priority_queue <PDI,vector <PDI>,greater <PDI> > heap;
	heap.push ({f (start),start});
	st[start] = true;
	while (heap.size ()) {
		int t = heap.top ().second;
		heap.pop ();
		if (!t) return dist[t];
		for (int i = 0;i < 12;i++) {
			int ti = t >> i * 2 & 3,ni = g[i][ti],nti = t >> ni * 2 & 3;
			int res = t ^ (ti << (i * 2)) ^ (((ti + 1) & 3) << (i * 2));
			res ^= (nti << (ni * 2)) ^ (((nti + 1) & 3) << (ni * 2));
			if (!st[res]) {
				dist[res] = dist[t] + 1,st[res] = true;
				pre[res] = t,op[res] = i + 1;
				heap.push ({dist[res] + f (res),res});
			}
		}
	}
	return -1;
}
void print_ans (int x) {
	if (x == start) return ;
	print_ans (pre[x]);
	cout << op[x] << ' ';
}
int main () {
	for (int i = 0;i < 12;i++) {
		int x;
		cin >> x;
		start |= (x - 1) << (2 * i);
		for (int j = 0;j < 4;j++) {
			cin >> g[i][j];
			g[i][j]--;
		}
	}
	cout << A_star () << endl;
	print_ans (0);
	return 0;
}

2023/1/10 17:31
加载中...