http://www.elijahqi.win/archives/3046
Description
在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动
时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移
动到某人心中的目标状态。
Input
前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具。接着是一个空
行。接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上。
Output
一个整数,所需要的最少移动次数。
Sample Input
1111
0000
1110
0010
1010
0101
1010
0101
Sample Output
4
直接状压成int 然后bfs一下即可 休闲题qwq
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=131072;
int s,t;char s1[5];queue<int>q;
int dx[4]={0,1,-1,0},dy[4]={1,0,0,-1};
bool flag[N];int dis[N];
int main(){
freopen("bzoj1054.in","r",stdin);
for (int i=0;i<4;++i){
scanf("%s",s1);
for (int j=0;j<4;++j) s|=(s1[j]&1)*(1<<i*4+j);
}
for (int i=0;i<4;++i){
scanf("%s",s1);
for (int j=0;j<4;++j) t|=(s1[j]&1)*(1<<i*4+j);
}q.push(s);flag[s]=1;if (s==t) {puts("0");return 0;}
while(!q.empty()){
int x=q.front();q.pop();
for (int i=0;i<4;++i){
for (int j=0;j<4;++j){
if (!(x&(1<<i*4+j)))continue;
for (int k=0;k<4;++k){
int x1=i+dx[k],y1=j+dy[k];
if (x1<0||x1>3||y1<0||y1>3) continue;
if (x&(1<<x1*4+y1)) continue;
int to=x-(1<<i*4+j);to+=1<<x1*4+y1;
if (flag[to]) continue;flag[to]=1;
dis[to]=dis[x]+1;q.push(to);
if (to==t) {printf("%d\n",dis[t]);return 0;}
}
}
}
}
return 0;
}