Problem : [HAOI2008]移动玩具

Problem : [HAOI2008]移动玩具
原题链接:https://begin.lydsy.com/JudgeOnline/problem.php?cid=1258&pid=18

#include <cmath>
#include <cstdio>
#include <cstring>
char ch[10001];
char st[10001],ed[10001],dq[10001];
int dl[1000001],zb[1000001],h[1000001];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int js=0;
void read()
{
    scanf("%s",dq+1);
    st[1]=dq[1],st[2]=dq[2],st[3]=dq[3],st[4]=dq[4];
    scanf("%s",dq+1);
    st[5]=dq[1],st[6]=dq[2],st[7]=dq[3],st[8]=dq[4];
    scanf("%s",dq+1);
    st[9]=dq[1],st[10]=dq[2],st[11]=dq[3],st[12]=dq[4];
    scanf("%s",dq+1);
    st[13]=dq[1],st[14]=dq[2],st[15]=dq[3],st[16]=dq[4];

    scanf("%s",dq+1);
    ed[1]=dq[1],ed[2]=dq[2],ed[3]=dq[3],ed[4]=dq[4];
    scanf("%s",dq+1);
    ed[5]=dq[1],ed[6]=dq[2],ed[7]=dq[3],ed[8]=dq[4];
    scanf("%s",dq+1);
    ed[9]=dq[1],ed[10]=dq[2],ed[11]=dq[3],ed[12]=dq[4];
    scanf("%s",dq+1);
    ed[13]=dq[1],ed[14]=dq[2],ed[15]=dq[3],ed[16]=dq[4];
}
int Hash(char nu[10001])
{
    int da=0;
    for(int i=0;i<=15;i++)
    {
        if(nu[i]=='1')
        {
            da+=pow(2,16-i-1);
        }
    }
    return da;
}
void zh(int t)
{
    char yc[10001];
    for(int i=1;i<=16;i++)
    {
        if(((1<<i-1)&t)>0)
        {
            yc[i]='1';
        }
        else
        {
            yc[i]='0';
        }
    }
    for(int i=1;i<=16;i++)
    {
        ch[i]=yc[16-i+1];
    }
}
void bfs()
{
    int tou=1,wei=2;
    h[dl[1]]=1,zb[1]=0;
    while(tou<wei)
    {
        zh(dl[tou]);
        for(int i=1;i<=16;i++)
        {
            if(ch[i]=='0')
            {
                int x=0,y=0;
                if(i%4==0)
                {
                    x=i/4;
                }
                else
                {
                    x=i/4+1;
                }
                y=i%4;
                if(y==0)
                {
                    y=4;
                }
                int k=(x-1)*4+y;
                for(int j=0;j<=3;j++)
                {
                    int nx=x+dx[j];
                    int ny=y+dy[j];
                    if(nx>=1 && nx<=4 && ny>=1 && ny<=4 && ch[(nx-1)*4+ny]=='1')
                    {
                        int nk=(nx-1)*4+ny;
                        char now[101];
                        for(int t=1;t<=16;t++)
                        {
                            now[t]=ch[t];
                        }
                        now[k]='1';
                        now[nk]='0';
                        int xn=Hash(now+1);
                        if(xn==js)
                        {
                            printf("%d",zb[tou]+1);
                            return ;
                        }
                        if(h[xn]==0)
                        {
                            dl[wei]=xn;
                            h[xn]=wei;
                            zb[wei]=zb[tou]+1;
                            wei++;
                        }
                    }
                }
            }
        }
        tou++;
    }
}
int main()
{
    read();
    dl[1]=Hash(st+1);
    js=Hash(ed+1);
    if(dl[1]==js)
    {
        printf("0");
        return 0;
    }
    bfs();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41654438/article/details/81811184