传送门: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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/le_ballon_rouge/article/details/47999185