#include <bits/stdc++.h>
using namespace std;
int g[(1<<24)+5];
int pre[(1<<24)+5][2];
int a[13][5];
int ys(int *x)
{
int ans=0;
for(int i=1;i<=12;i++)
{
ans=(ans<<2)|x[i];
}
return ans;
}
void jy(int y,int *x)
{
for(int i=12;i>=1;i--)
{
x[i]=y&3;
y>>=2;
}
}
int ins(int i,int *x)
{
x[a[i][x[i]+1]]++;
x[a[i][x[i]+1]]%=4;
x[i]++;
x[i]%=4;
return ys(x);
}
void sc(int x)
{
if(pre[x][0]==-1) return;
sc(pre[x][0]);
cout<<pre[x][1]<<" ";
}
struct node{
int x;
double f;
node(int nx)
{
x=nx;
double h=0;
int o[13];
jy(x,o);
for(int i=1;i<=12;i++) h+=min(4-o[i],o[i]-0);
h/=2;
f=g[x]+h;
}
};
bool operator < (node x,node y)
{
return x.f>y.f;
}
priority_queue <node> q;
int main()
{
memset(g,-1,sizeof(g));
memset(pre,-1,sizeof(pre));
int x[13];
for(int i=1;i<=12;i++)
{
cin>>x[i];
x[i]--;
for(int j=1;j<=4;j++) cin>>a[i][j];
}
int b=ys(x);
for(int i=1;i<=12;i++) x[i]=0;
int e=ys(x);
if(b==e)
{
cout<<0;
return 0;
}
g[b]=0;
q.push(node(b));
int k;
while(!q.empty())
{
node p=q.top();
q.pop();
int y[13];
jy(p.x,y);
for(int i=1;i<=12;i++)
{
int z[13];
memcpy(z,y,sizeof(y));
k=ins(i,z);
if(g[k]==-1)
{
g[k]=g[p.x]+1;
pre[k][0]=p.x;
pre[k][1]=i;
if(k==e)
{
cout<<g[k]<<endl;
sc(k);
return 0;
}
q.push(node(k));
}
}
}
return 0;
}
测试链接