c++20tle3ge点,c++14直接快到起飞。。。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1 << 24;
int g[N], nxt[12][4], fa[N], ans[20], choice[N];
struct node{
int st;
double F;
node(int s):st(s){
double h = 0;
F = 0;
for(int i=0;i<12;i++){
if((s>>(i*2))&3)
h += 4 - ((s>>(i*2))&3);
}
F = h + g[s];
}
bool operator<(const node &y) const{
return F > y.F;
}
};
priority_queue<node>q;
int main(){
int b, s;
for(int i=0;i<12;i++){
cin>>b;
s |= (b - 1) << (i * 2);
for(int j=0;j<4;j++){
cin>>nxt[i][j];
nxt[i][j] -= 1;
}
}
q.push(node(s));
while(q.size()){
int state = q.top().st;
q.pop();
if(!state)
break;
int si, snxt, nx, nxstate;
for(int i=0;i<12;i++){
si = (state>>(i*2))&3;
nx = nxt[i][si];
snxt = (state>>(nx*2))&3;
nxstate = state ^ (si<<(i*2)) ^ (((si+1)&3)<<(i*2));
nxstate = nxstate ^ (snxt <<(nx*2)) ^ (((snxt+1)&3)<<(nx*2));
if(!g[nxstate]){
g[nxstate] = g[state] + 1;
fa[nxstate] = state;
choice[nxstate] = i+1;
q.push(node(nxstate));
}
}
}
int cnt = 0;
int state = 0;
while(state!=s){
ans[++cnt] = choice[state];
state = fa[state];
}
cout<<cnt<<endl;
for(int i=cnt;i;i--){
cout<<ans[i]<<" ";
}
return 0;
}