Description
在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动
时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移
动到某人心中的目标状态。
Input
前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具。接着是一个空
行。接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上。
Output
一个整数,所需要的最少移动次数。
题意:
我们可以将这个方框排成一列,看作一个二进制数
然后从s到t的最少移动次数,很显然的BFS的功能。
想到这些就能直接写了,没什么难点
AC代码:
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
#define pii pair<int,int>
#define mp(a,b) make_pair(a,b)
const int MAXN = (1<<16)+20;
const int MOD = 1000000007;
const int INF = 0x3f3f3f3f;
int s,t; char op; bool vis[MAXN];
struct node{ int sta,step; };
inline int bfs(){
queue<node> que;
que.push({s,0}); vis[s]=1;
while(!que.empty()){
node x=que.front(); que.pop();
int u = x.sta,st = x.step;
if(u==t) return st;
for(int i=0;i<16;i++){
if((u>>i)&1){
if(i+4<16 && ((u>>(i+4))&1)==0){
int sta = (u^(1<<i))|(1<<(i+4));
if(!vis[sta]) que.push({sta,st+1}),vis[sta]=1;
}
if(i-4>=0 && ((u>>(i-4))&1)==0){
int sta = (u^(1<<i))|(1<<(i-4));
if(!vis[sta]) que.push({sta,st+1}),vis[sta]=1;
}
if(i%4<3 && ((u>>(i+1))&1)==0){
int sta = (u^(1<<i))|(1<<(i+1));
if(!vis[sta]) que.push({sta,st+1}),vis[sta]=1;
}
if(i%4>0 && ((u>>(i-1))&1)==0){
int sta = (u^(1<<i))|(1<<(i-1));
if(!vis[sta]) que.push({sta,st+1}),vis[sta]=1;
}
}
}
}
return 0;
}
signed main(){
#ifndef ONLINE_JUDGE
freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin);
#endif // ONLINE_JUDGE
for(int i=0;i<4;i++) for(int j=0;j<4;j++) cin>>op,s=(s<<1)+op-'0';
for(int i=0;i<4;i++) for(int j=0;j<4;j++) cin>>op,t=(t<<1)+op-'0';
printf("%d\n",bfs());
return 0;
}