1 条题解
-
0
C++ :
#include<cstdio> #include<cstring> using namespace std; void swap(int &a,int &b){int c=a;a=b;b=c;} struct node { int a[10],fa,dep; char c; }list[41000]; bool bo[41000]; int d[10]; int l=0;char s[110]; void print(node no) { while(no.fa!=0) { s[++l]=no.c; no=list[no.fa]; } for(int i=l;i>=1;i--)printf("%c",s[i]); } node A(node no) { /*for(int i=1;i<=4;i++)swap(no.a[i],no.a[i+4]); swap(no.a[1],no.a[4]);swap(no.a[2],no.a[3]); return no;*/ for(int i=1;i<=4;i++) swap(no.a[i],no.a[9-i]); return no; } node B(node no) { /*swap(no.a[6],no.a[8]);no.a[0]=no.a[4]; for(int i=1;i<=3;i++)no.a[i+1]=no.a[i]; no.a[1]=no.a[0];*/ for(int i=4;i>=2;i--) { swap(no.a[i-1],no.a[i]); swap(no.a[9-i],no.a[10-i]); } return no; } node C(node no) { /*swap(no.a[2],no.a[7]);swap(no.a[3],no.a[7]); swap(no.a[5],no.a[8]);*/ swap(no.a[3],no.a[2]); swap(no.a[7],no.a[6]); swap(no.a[2],no.a[6]); return no; } int kt(node n) { int ans=0; for(int i=1;i<=8;i++) { for(int j=i+1;j<=8;j++)if(n.a[i]>n.a[j])ans+=d[8-i]; } return ans+1; } int main() { memset(bo,true,sizeof(bo)); d[0]=1;for(int i=1;i<=8;i++)d[i]=d[i-1]*i; for(int i=1;i<=8;i++)list[1].a[i]=i; for(int i=1;i<=8;i++)scanf("%d",&list[0].a[i]); int aim=kt(list[0]); int head=1,tail=1; list[1].dep=0;list[1].fa=0; bo[kt(list[1])]=false; while(head<=tail) { node tno=list[head]; bool bk=true; for(int i=1;i<=8;i++)if(tno.a[i]!=list[0].a[i]){bk=false;break;} if(bk) { printf("%d\n",tno.dep); print(tno); return 0; } for(int i=1;i<=3;i++) { node no; if(i==1)no=A(tno); else if(i==2)no=B(tno); else if(i==3)no=C(tno); int kk=kt(no); if(bo[kk]) { bo[kk]=false; tail++; no.dep++;no.c='A'+i-1; no.fa=head; list[tail]=no; /*if(kk==aim) { printf("%d\n",&no.dep); print(no); return 0; }*/ } } head++; } return 0; }
- 1
信息
- ID
- 1061
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 3
- 上传者