1 条题解

  • 0
    @ 2023-6-21 20:14:12

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