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