BZOJ1054

传送门:BZOJ1054

傻逼广搜题,按位转化为二进制判重。

坑爹之处在于数字居然是黏在一起给出来的……

代码上的小细节见下。

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;

int mx[4]={-1,0,1,0},my[4]={0,1,0,-1};

struct Matrix{
    int c[5][5];
    int step;
    void Print(){
        for(int i=1;i<=4;i++){
            for(int j=1;j<=4;j++)
                printf("%d ",c[i][j]);
            printf("\n");
        }
    }
};

queue<Matrix> Q;
Matrix Begin,End;
bool used[1000005];

int GetHash(Matrix a)
{
    int ans=0,tot=0;
    for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++)
            ans+=a.c[i][j]*(1<<(++tot));
    return ans;
}

bool Equal(Matrix a,Matrix b)
{
    return GetHash(a)==GetHash(b);
}

void Solve()
{
    Q.push(Begin);
    used[GetHash(Begin)]=true;
    while(!Q.empty()){
        Matrix b=Q.front();Q.pop();
        if(Equal(b,End)){
            printf("%d\n",b.step);
            return;
        }
        for(int i=1;i<=4;i++)
            for(int j=1;j<=4;j++){
                if(b.c[i][j]==0)
                    continue;
                Matrix a=b;
                a.c[i][j]=0;
                for(int k=0;k<=3;k++){
                    int x=i+mx[k],y=j+my[k];
                    if(x<1||x>4||y<1||y>4||a.c[x][y]!=0)
                        continue;
                    a.c[x][y]=1;
                    if(!used[GetHash(a)]){
                        used[GetHash(a)]=true;
                        a.step++;
                        Q.push(a);
                        a.step--;
                    }
                    a.c[x][y]=0;
                }
            }
    }
}

void Readdata()
{
    freopen("loli.in","r",stdin);
    char c;
    for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            scanf("%c",&c);
            Begin.c[i][j]=c-‘0‘;
        }
        scanf("\n");
    }
    scanf("\n");
    for(int i=1;i<=4;i++){
        for(int j=1;j<=4;j++){
            scanf("%c",&c);
            End.c[i][j]=c-‘0‘;
        }
        scanf("\n");
    }
}

void Close()
{
    fclose(stdin);
    fclose(stdout);
}

int main()
{
    Readdata();
    Solve();
    Close();
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 08:22:59

BZOJ1054的相关文章

BZOJ1054(搜索)

大力搜,状态用一个16位的数字表示. 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define rep(i,a,b) for(int i(a); i <= (b); ++i) 6 7 const int A = 30 + 1; 8 9 struct node{int x, y; } op[A]; 10 struct Node{int num, step;} now, np; 11 12 char st[A][A]; 1

【bzoj1054】[HAOI2008]移动玩具

题目描述 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移动到某人心中的目标状态. 输入 前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具.接着是一个空行.接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上. 输出 一个整数,所需要的最少移动次数. 样例输入 1111 0000 1110 0010 1

BZOJ1054: [HAOI2008]移动玩具

1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1028  Solved: 555[Submit][Status] Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移动到某人心中的目标状态. Input 前4行表示玩具的初始状态,每行4个

bzoj1054题解

[解题思路] 直接状压BFS即可,我实现的比较渣..复杂度O(45*216). [参考代码] 1 #include <bits/stdc++.h> 2 #define range(i,c,o) for(register int i=(c);i<(o);++i) 3 #define dange(i,c,o) for(register int i=(c);i>(o);--i) 4 using namespace std; 5 6 //#define __debug 7 #ifdef _

【BFS】bzoj1054 [HAOI2008]移动玩具

暴搜吧,可以哈希一下,但是懒得写哈希了,所以慢得要死. Code: 1 #include<cstdio> 2 #include<queue> 3 #include<set> 4 #include<algorithm> 5 using namespace std; 6 const int di[]={0,0,-1,1},dj[]={-1,1,0,0}; 7 struct Squ{char S[4][4];}; 8 struct Node{Squ v;int d

BZOJ1054|HAOI2008移动玩具|广搜

Description在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移动到某人心中的目标状态.Input前4行表示玩具的初始状态,每行4个数字1或0,1表示方格中放置了玩具,0表示没有放置玩具.接着是一个空行.接下来4行表示玩具的目标状态,每行4个数字1或0,意义同上.Output一个整数,所需要的最少移动次数.Sample Input111100

[HAOI2008][BZOJ1054] 移动玩具

1054: [HAOI2008]移动玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1277  Solved: 695[Submit][Status][Discuss] Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移动次数将初始的玩具状态移动到某人心中的目标状态. Input 前4行表示玩具的

HAOI2008题解

又来写题解辣-然而并不太清楚题目排列情况...不管辣先写起来- T1:[bzoj1041] 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 一个赤果果的数学题--- 首先坐标轴上一定有四个, 最大公约数搞一下然后判断一下就可以啦,细节全部都在代码- 代码如下: 1 var i,j,ans,d:longint; 2 t,r,m:int64; 3 function flag(x,y:longint):longint; 4 var t

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734