码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ1054

时间:2015-08-26 10:44:00      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:二进制   搜索   广搜   hash   

传送门: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;
}

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

BZOJ1054

标签:二进制   搜索   广搜   hash   

原文地址:http://blog.csdn.net/le_ballon_rouge/article/details/47999185

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!