在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动
时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移
动到某人心中的目标状态。
标签:math ext nbsp bfs 左右 表示 stat 运算 print
一个整数,所需要的最少移动次数。
试题分析:也许太闲的了,我竟然使位运算写这题(一时脑抽)……
简简单单的BFS,正解再加个HASH搞定
想想我这样好像还省了个Hash QAQ
代码(大神勿喷)
#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<stack> #include<vector> #include<algorithm> //#include<cmath> using namespace std; const int INF = 9999999; #define LL long long inline int read(){ int x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘; return x*f; } int N,E; bool vis[65539]; char c; int l=1,r=1; struct data{ int st,k; }Que[700001]; void BFS(){ Que[l].st=0,Que[l].k=N; int step,Now; if(Que[l].k==E){ printf("%d\n",Que[l].st); return ; } while(l<=r){ Now=Que[l].k,step=Que[l].st; for(int i=1;i<=4;i++){ for(int j=1;j<=4;j++){ if(((Now>>((4-i)*4+4-j))&1)){ for(int p=0;p<4;p++){ if(p==0&&i!=1&&!((Now>>((4-(i-1))*4+4-j))&1)&&!vis[Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4+8-j))]){ Que[++r].k=Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4+8-j)); if(Que[r].k==E){ printf("%d\n",step+1); return ; } Que[r].st=step+1; vis[Que[r].k]=1; } if(p==1&&i!=4&&!((Now>>((4-(i+1))*4+4-j))&1)&&!vis[Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4-j))]){ Que[++r].k=Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4-j)); if(Que[r].k==E){ printf("%d\n",step+1); return ; } Que[r].st=step+1; vis[Que[r].k]=1; } if(p==2&&j!=1&&!((Now>>((4-i)*4+4-(j-1)))&1)&&!vis[(1<<((4-i)*4+4-j))+(1<<((4-i)*4+4-(j-1)))]){ Que[++r].k=Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4+4-(j-1))); if(Que[r].k==E){ printf("%d\n",step+1); return ; } Que[r].st=step+1; vis[Que[r].k]=1; } if(p==3&&j!=4&&!((Now>>((4-i)*4+4-(j+1)))&1)&&!vis[Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4+4-(j+1)))]){ Que[++r].k=Now-(1<<((4-i)*4+4-j))+(1<<((4-i)*4+4-(j+1))); if(Que[r].k==E){ printf("%d\n",step+1); return ; } Que[r].st=step+1; vis[Que[r].k]=1; } } } } } l++; } } int main(){ //freopen(".in","r",stdin); //freopen(".out","w",stdout); int tmp=16; for(int i=1;i<=4;i++) for(int j=1;j<=4;j++){ cin>>c; N=N+(1<<(tmp-1))*(c-‘0‘); tmp--; } vis[N]=true; tmp=16; for(int i=1;i<=4;i++) for(int j=1;j<=4;j++){ cin>>c; E=E+(1<<(tmp-1))*(c-‘0‘); tmp--; } BFS(); return 0; }
标签:math ext nbsp bfs 左右 表示 stat 运算 print
原文地址:http://www.cnblogs.com/wxjor/p/6964278.html