1 条题解

  • 0
    @ 2025-9-10 9:15:12

    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
    上传者