题目描述
题解
为何会跑这么慢。。。
暴力bfs,每一次将整个棋盘抽象成二进制数然后hash判重。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
int ed,ans;
char s[10];
struct hp{int a[10][10],step;}st;
int dx[4]={1,-1,0,0};int dy[4]={0,0,1,-1};
bool hash[100000];
queue <hp> q;
int Hash(hp x)
{
int ans=0;
for (int i=1;i<=4;++i)
for (int j=1;j<=4;++j)
{
int now=(i-1)*4+j;
ans+=(x.a[i][j]<<(now-1));
}
return ans;
}
int bfs()
{
int val=Hash(st);if (val==ed) return 0;
hash[val]=true;q.push(st);
while (!q.empty())
{
hp now=q.front();q.pop();
for (int i=1;i<=4;++i)
for (int j=1;j<=4;++j)
if (now.a[i][j]==1)
{
for (int k=0;k<4;++k)
{
hp nxt=now;
int x=i+dx[k],y=j+dy[k];
if (x<1||x>4||y<1||y>4||nxt.a[x][y]) continue;
nxt.a[i][j]=0,nxt.a[x][y]=1;
val=Hash(nxt);
if (val==ed) return nxt.step+1;
if (!hash[val])
{
hash[val]=true;
++nxt.step;
q.push(nxt);
}
}
}
}
return 0;
}
int main()
{
for (int i=1;i<=4;++i)
{
gets(s);
for (int j=1;j<=4;++j) st.a[i][j]=s[j-1]-'0';
}
st.step=0;
gets(s);
for (int i=1;i<=4;++i)
{
gets(s);
for (int j=1;j<=4;++j)
{
int x=s[j-1]-'0';
int now=(i-1)*4+j;
ed+=(x<<(now-1));
}
}
ans=bfs();
printf("%d\n",ans);
}