bfs
Code:
/**************************************************************
Problem: 1054
User: wohenshuai
Language: C++
Result: Accepted
Time:40 ms
Memory:1356 kb
****************************************************************/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
char map[5][5];
int dep;
node()
{
dep=0;
}
}st,ed;
queue<node>Q;
int bit[17];
void Input()
{
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
scanf("\n%c",&st.map[i][j]);
scanf("\n");
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
scanf("\n%c",&ed.map[i][j]);
Q.push(st);
}
int hash_(node x)
{
int ans=0;
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
int t=x.map[i][j]-'0';
ans+=t*bit[(i-1)*4+j];
}
}
return ans;
}
bool hash[80000];
int dx[5]={0,0,1,0,-1};
int dy[5]={0,1,0,-1,0};
void Solve()
{
for(int i=1;i<=16;i++) bit[i]=(1<<(i-1));
int hash_st=hash_(st); int hash_ed=hash_(ed);
if(hash_st==hash_ed){printf("0\n"); return ;}
memset(hash,0,sizeof(hash));
hash[hash_st]=1; hash[hash_ed]=1;
while(!Q.empty())
{
node k=Q.front();
for(int x=1;x<=4;x++)
{
for(int y=1;y<=4;y++)
{
if(k.map[x][y]=='1')
{
for(int i=1;i<=4;i++)
{
int xx,yy;
xx=x+dx[i]; yy=y+dy[i];
if(k.map[xx][yy]=='0'&&xx>0&&yy>0&&xx<=4&&yy<=4)
{
node ky=k;
swap(ky.map[x][y],ky.map[xx][yy]);
ky.dep++;
int hash_ky=hash_(ky);
if(hash[hash_ky]==0)
{
hash[hash_ky]=1;
Q.push(ky);
}
if(hash_ky==hash_ed)
{
printf("%d\n",ky.dep);
return ;
}
}
}
}
}
}
Q.pop();
}
}
int main()
{
Input();
Solve();
return 0;
}