只写了第一个问
#include<bits/stdc++.h>
using namespace std;
typedef long long llong;
const int N=23,M=2e7+3;
int s;
int a[N][N];
int h(int s){
int ret=0;
for(int i=0;i<12;i++)
if((s>>(i*2))&3)
ret+=4-((s>>(i*2))&3);
return ret/2;
}
priority_queue<tuple<int,int,int> > q;
bool vis[M];
int pre[M],ans[M];
int main(){
#ifdef LOCAL
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
for(int i=0;i<12;i++){
int x;
cin>>x;
s|=(x-1)<<(i*2);
for(int j=0;j<4;j++){
cin>>a[i][j];
a[i][j]--;
}
}
vis[s]=1;
q.push({h(s),0,s});
while(!q.empty()){
int st=get<2>(q.top()),step=get<1>(q.top());
q.pop();
if(st==0){
cout<<step<<endl;
return 0;
}
for(int i=0;i<12;i++){
int ns=st;
int s1=(st>>(i*2))&3;
int p=a[i][s1];
int s2=(st>>(p*2))&3;
ns^=s1<<(i*2);
ns^=((s1+1)&3)<<(i*2);
ns^=s2<<(p*2);
ns^=((s2+1)&3)<<(p*2);
if(!vis[ns]){
vis[ns]=1;
q.push({step+1+h(ns),step+1,ns});
}
}
}
return 0;
}
‵‵‵