bzoj 1054: [HAOI2008]移动玩具

bfs水ti

/**************************************************************
    Problem: 1054
    User: lxy8584099
    Language: C++
    Result: Accepted
    Time:24 ms
    Memory:1812 kb
****************************************************************/
 
#include<cstdio>
using namespace std;
const int N=126536;
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int goal,num[N];
int q[N];
char s[120];
int main()
{
    int k=0;
    for(int i=1;i<=4;i++)
    {
        scanf("%s",s+1);for(int j=1;j<=4;j++) k=((k<<1)+s[j]-'0');
    }
    for(int i=1;i<=4;i++)
    {
        scanf("%s",s+1);for(int j=1;j<=4;j++) goal=((goal<<1)+s[j]-'0');
    }
    num[k]=1;int l=0,r=1; q[1]=k;
    while(l<r)
    {
        l++;int kk=q[l];
        if(kk==goal) {printf("%d\n",num[kk]-1);return 0;}
        for(int i=1;i<=16;i++)
        {
            if(!(kk&(1<<(i-1)))) continue;
            for(int j=0;j<4;j++)
            {
                if(j==0&&i%4==0) continue;
                if(j==2&&i%4==1) continue;
                k=i;int x=kk;
                k+=(dx[j]*4);k+=dy[j];
                if(k>0&&k<=16&&(!(x&(1<<(k-1)))))
                {
                    x^=(1<<(k-1));x^=(1<<(i-1));
                    if(!num[x]) {num[x]=num[kk]+1;q[++r]=x;}
                }
            }
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lxy8584099/p/10300894.html