【USACO3-2-5】魔板 康托展开

原题

关于康托展开:我是在这里学的

#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;
}

猜你喜欢

转载自blog.csdn.net/dadatu_zhao/article/details/80424332