BZOJ 1054: [HAOI2008]移动玩具(状压,BFS)

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

发布了152 篇原创文章 · 获赞 1 · 访问量 2709

猜你喜欢

转载自blog.csdn.net/qq_43544481/article/details/103789719