1 条题解
-
0
C :
#include<stdio.h> #include<stdlib.h> #include<math.h> int flag[8][8][8][8][8][8][8]; int a[9]; int sta[9]; int to[9]; char output[501]; int q[100001][3]; int check() { return !flag[to[1]][to[2]][to[3]][to[4]][to[5]][to[6]][to[7]]? flag[to[1]][to[2]][to[3]][to[4]][to[5]][to[6]][to[7]]=1: 0; } int main() { int i,j,k,m,n; int target=0; for(i=1;i<=4;i++) scanf("%d",&a[i]); for(i=8;i>=5;i--) scanf("%d",&a[i]); for(i=1;i<=8;i++) target*=10,target+=a[i]; q[1][0]=12348765; if(q[1][0]==target) { printf("0\n\n"); return 0; } int s=0,t=1; while(s<t) { s++; int now=q[s][0]; for(i=1;i<=8;i++) sta[8-i+1]=now%10,now/=10; to[1]=sta[5];to[5]=sta[1]; to[2]=sta[6];to[6]=sta[2]; to[3]=sta[7];to[7]=sta[3]; to[4]=sta[8];to[8]=sta[4]; if(check()) { m=0; for(i=1;i<=8;i++) m*=10,m+=to[i]; q[++t][0]=m; q[t][1]=s; q[t][2]=0; } if(m==target) break; to[1]=sta[4];to[5]=sta[8]; to[2]=sta[1];to[6]=sta[5]; to[3]=sta[2];to[7]=sta[6]; to[4]=sta[3];to[8]=sta[7]; if(check()) { m=0; for(i=1;i<=8;i++) m*=10,m+=to[i]; q[++t][0]=m; q[t][1]=s; q[t][2]=1; } if(m==target) break; to[1]=sta[1];to[5]=sta[5]; to[2]=sta[6];to[6]=sta[7]; to[3]=sta[2];to[7]=sta[3]; to[4]=sta[4];to[8]=sta[8]; if(check()) { m=0; for(i=1;i<=8;i++) m*=10,m+=to[i]; q[++t][0]=m; q[t][1]=s; q[t][2]=2; } if(m==target) break; } n=0; k=t; while(k!=1) output[++n]=q[k][2]+'A',k=q[k][1]; printf("%d\n",n); int calc=0; for(i=n;i>=1;i--) { putchar(output[i]); ++calc; if(calc%60==0) printf("\n"); } printf("\n"); return 0; }C++ :
#include<iostream> using namespace std; int jc[10]={1,1,2,6,24,120,720,5040}; int father[50005],st,b[1000005],step[50005],g; char a[50005]; struct note{ int a[2][4]; }start,goal,q[90005]; int Turn(note x){ //康托展开 int res=0,t[10],s; for(int i=0;i<4;i++)t[i]=x.a[0][i]; for(int i=3;i>=0;i--)t[7-i]=x.a[1][i]; for(int i=0;i<8;i++){ s=0; for(int j=i+1;j<=7;j++)if(t[j]<t[i])s++; res+=jc[7-i]*s; } return res; } note Change(int way,int num){ note tmp; if(way==1){ //way:A for(int i=0;i<4;i++)tmp.a[0][i]=q[num].a[1][i]; for(int i=0;i<4;i++)tmp.a[1][i]=q[num].a[0][i]; return tmp; } if(way==2){ //way:B tmp.a[0][0]=q[num].a[0][3]; tmp.a[1][0]=q[num].a[1][3]; for(int i=1;i<4;i++)tmp.a[0][i]=q[num].a[0][i-1]; for(int i=1;i<4;i++)tmp.a[1][i]=q[num].a[1][i-1]; return tmp; } if(way==3){ //way:C tmp.a[0][0]=q[num].a[0][0];tmp.a[0][3]=q[num].a[0][3]; tmp.a[1][0]=q[num].a[1][0];tmp.a[1][3]=q[num].a[1][3]; tmp.a[0][1]=q[num].a[1][1];tmp.a[0][2]=q[num].a[0][1]; tmp.a[1][2]=q[num].a[0][2];tmp.a[1][1]=q[num].a[1][2]; return tmp; } } void Output(int num){ if(num==1)return; Output(father[num]); cout<<a[num]; } void Bfs(){ int st=1,ed=1,t; note tmp; q[1]=start; step[1]=0; father[1]=1; while(st<=ed){ for(int i=1;i<=3;i++){ tmp=Change(i,st); t=Turn(tmp); if(!b[t]){ //没有标记,入队 ed++; q[ed]=tmp; step[ed]=step[st]+1; b[t]=1; father[ed]=st; //记录父结点 a[ed]=char('A'+i-1); if(t==g){ cout<<step[ed]<<endl; Output(ed); return; } } } st++; } } int main(){ for(int i=0;i<4;i++)start.a[0][i]=i+1; for(int i=3;i>=0;i--)start.a[1][i]=8-i; st=Turn(start); b[st]=1; for(int i=0;i<4;i++)cin>>goal.a[0][i]; for(int i=3;i>=0;i--)cin>>goal.a[1][i]; g=Turn(goal); if(g==st){ cout<<0<<endl; return 0; } Bfs(); return 0; }
- 1
信息
- ID
- 4480
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者