关于康托展开:我是在这里学的
#include<iostream> #include<map> #include<queue> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; queue<int> q; map<int,bool> visit; struct node{int a[10];int step,n;}p[80009]; int fun[8]={0,5040,720,120,24,6,2,1},fa[80009]; int n,m,goal,cnt=1; int contor(int x) { int num=0,k; for (int i=1;i<=8;i++) { k=0; for (int j=i+1;j<=8;j++) if (p[x].a[i]>p[x].a[j]) k++; num+=k*fun[i]; } return num; } void init() { for (int i=1;i<=4;i++) p[1].a[i]=i; for (int i=5;i<=8;i++) p[1].a[i]=13-i; visit[contor(1)]=true; } void A(int x){for (int i=1;i<=4;i++) swap(p[x].a[i],p[x].a[i+4]);} void B(int x){swap(p[x].a[4],p[x].a[3]);swap(p[x].a[8],p[x].a[7]);swap(p[x].a[3],p[x].a[2]);swap(p[x].a[7],p[x].a[6]);swap(p[x].a[2],p[x].a[1]);swap(p[x].a[6],p[x].a[5]);} void C(int x){swap(p[x].a[2],p[x].a[3]);swap(p[x].a[2],p[x].a[7]);swap(p[x].a[2],p[x].a[6]);} void write(int x){if (x==1) return;write(fa[x]);printf("%c",p[x].n+'A');} void bfs() { q.push(1);p[1].step=0; while(!q.empty()) { int x=q.front();q.pop(); for (int i=1;i<=3;i++) { cnt++; for (int j=1;j<=8;j++) p[cnt].a[j]=p[x].a[j]; switch(i) { case 1:{A(cnt);break;} case 2:{B(cnt);break;} case 3:{C(cnt);break;} } int id=contor(cnt); if (!visit[id]) { visit[id]=true; p[cnt].step=p[x].step+1; p[cnt].n=i-1;fa[cnt]=x; q.push(cnt); if (goal==id){printf("%d\n",p[cnt].step);write(cnt);exit(0);} } else cnt--; } } } int main() { init(); for (int i=1;i<=4;i++) scanf("%d",&p[0].a[i]); for (int i=1;i<=4;i++) scanf("%d",&p[0].a[9-i]); goal=contor(0); if (visit[goal]) printf("0\n"); else bfs(); return 0; }