关于康托展开:我是在这里学的
#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;
}