您的位置:首页 > 其它

BZOJ1054

2015-08-26 10:06 260 查看
传送门:BZOJ1054

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

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

代码上的小细节见下。

[code]#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: