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;
}