您的位置:首页 > 其它

【BFS】bzoj1054 [HAOI2008]移动玩具

2014-09-07 14:49 344 查看
暴搜吧,可以哈希一下,但是懒得写哈希了,所以慢得要死。

Code:

#include<cstdio>
#include<queue>
#include<set>
#include<algorithm>
using namespace std;
const int di[]={0,0,-1,1},dj[]={-1,1,0,0};
struct Squ{char S[4][4];};
struct Node{Squ v;int d;Node(const Squ &a,const int &b){v=a;d=b;}Node(){}};
bool operator < (const Squ &a,const Squ &b)
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(a.S[i][j]<b.S[i][j])
return true;
else if(a.S[i][j]>b.S[i][j])
return false;
return false;
}
bool operator == (const Squ &a,const Squ &b)
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(a.S[i][j]!=b.S[i][j])
return false;
return true;
}
Squ from,to;
set<Squ>Set;
queue<Node>q;
inline bool check(const int &x,const int &y)
{
if(x>=0&&x<4&&y>=0&&y<4&&q.front().v.S[x][y]=='0')
return true;
return false;
}
inline void work(const Squ &tmp)
{
if(Set.find(tmp)==Set.end())
{
if(tmp==to)
{
printf("%d\n",q.front().d+1);
exit(0);
}
Set.insert(tmp);
q.push(Node(tmp,q.front().d+1));
}
}
int main()
{
for(int i=0;i<4;i++)scanf("%s",from.S[i]);
for(int i=0;i<4;i++)scanf("%s",to.S[i]);
if(from==to){printf("0\n");return 0;}
q.push(Node(from,0));
Set.insert(from);
while(!q.empty())
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(q.front().v.S[i][j]=='1')
{
for(int k=0;k<4;k++)
{
int ti=i+di[k],tj=j+dj[k];
if(check(ti,tj))
{
Squ tmp=q.front().v;
swap(tmp.S[i][j],tmp.S[ti][tj]);
work(tmp);
}
}
}
q.pop();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: