bzoj 1054

非常明显的广搜,但是为了方便判重,就用了状态压缩来优化。

虽然代码比较烦,不过逻辑倒是清晰的。可以用宏定义来简化代码。

#include<cstdio>
#include<cctype>
#define f1 f-(1<<i)+(1<<i+4)
#define f2 f-(1<<i)+(1<<i-4)
#define f3 f-(1<<i)+(1<<i-1)
#define f4 f-(1<<i)+(1<<i+1)
int read(){
    char c; while(!isdigit(c=getchar())); return c-'0';
}
int a,b,h,t,q[1<<16],vis[1<<16];
int main(){
    for(int i=0;i<16;i+=1) a|=read()<<i;
    for(int i=0;i<16;i+=1) b|=read()<<i;
    q[t++]=a; vis[a]=1;
    while(h<t && !vis[b]){
        int f=q[h++];
        for(int i=0;i<16;i+=1)
            if(f&(1<<i)){
                if(i<12 && !(f&(1<<i+4)) && !vis[f1]) vis[q[t++]=f1]=vis[f]+1;
                if(i>3 && !(f&(1<<i-4)) && !vis[f2]) vis[q[t++]=f2]=vis[f]+1;
                if(i%4 && !(f&(1<<i-1)) && !vis[f3]) vis[q[t++]=f3]=vis[f]+1;
                if(i%4!=3 && !(f&(1<<i+1)) && !vis[f4]) vis[q[t++]=f4]=vis[f]+1;
            }
    }
    printf("%d",vis[b]-1);
    return 0;
}

 

posted @ 2017-09-26 10:25  失忆的旅行者  阅读(119)  评论(0编辑  收藏  举报