您的位置:首页 > 其它

hdu 5012 Dice 2014 ACM/ICPC Asia Regional Xi'an Online

2014-10-19 16:53 507 查看
BFS遍历翻转之后的状态,因为一共就654321个状态,不会TLE。

Trick 可以将六个面的数字映射成一个十进制数用来判断BFS是否被访问过,防止重复遍历。

本机debug了好久,BFS居然忘了pop()。。。

#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include <ctype.h>
using namespace std;

class dice
{
public:
int ary[7];
int step;
// int value;
dice()
{
memset(ary,0,sizeof(ary));
step=0;
// value=0;
}
dice(int s)
{
memset(ary,0,sizeof(ary));
step=s;
// value=v;
}
};
dice a;
dice b;
queue<dice> q;
int ans;
int vis[1000000];
int done(dice d)//将每个dice上的组合map成一个整数,最大为654321,用于判断BFS是否访问过
{
int num=0;
for(int i=1;i<=6;i++)
{
num=num*10+d.ary[i];
}
return num;
}
bool same(dice d)
{
for(int i=1;i<=6;i++)
{
// cout<<d.ary[i]<<" "<<b.ary[i]<<endl;
if(d.ary[i]!=b.ary[i])
{
return false;
}
}
return true;
}
dice rotated(int n,dice d)
{
dice c;
if(n==1)//left
{
int tmp=d.ary[3];
c.ary[3]=d.ary[1];
c.ary[1]=d.ary[4];
c.ary[4]=d.ary[2];
c.ary[2]=tmp;
c.ary[5]=d.ary[5];//don not forget to copy these two
c.ary[6]=d.ary[6];
}
else if(n==2)//right
{
int tmp=d.ary[2];
c.ary[1]=d.ary[3];
c.ary[4]=d.ary[1];
c.ary[2]=d.ary[4];
c.ary[3]=tmp;
c.ary[5]=d.ary[5];
c.ary[6]=d.ary[6];
}
else if(n==3)//front
{
int tmp=d.ary[5];
c.ary[5]=d.ary[1];
c.ary[1]=d.ary[6];
c.ary[6]=d.ary[2];
c.ary[2]=tmp;
c.ary[3]=d.ary[3];
c.ary[4]=d.ary[4];
}
else if(n==4)//back
{
int tmp=d.ary[5];
c.ary[6]=d.ary[1];
c.ary[2]=d.ary[6];
c.ary[5]=d.ary[2];
c.ary[1]=tmp;
c.ary[3]=d.ary[3];
c.ary[4]=d.ary[4];
}
return c;
}
void bfs()
{
memset(vis,0,sizeof(vis));
ans=-1;
while(!q.empty()) q.pop();
a.step=0;
q.push(a);
vis[done(a)]=1;
dice tmp;
//cout<<done(a)<<endl;
while(!q.empty())
{
tmp=q.front();
q.pop();
if(same(tmp))
{ //cout<<done(tmp)<<" "<<tmp.step<<endl;

ans=tmp.step;
//cout<<ans<<" ";
break;
}
for(int i=1;i<=4;i++)
{
dice d=rotated(i,tmp);
if(vis[done(d)]==0)
{
//cout<<i<<" "<<done(d)<<endl;
d.step=tmp.step+1;
q.push(d);
vis[done(d)]=1;//否则回到原先的状态会重复遍历
//cout<<d.step<<endl;
}
}
}
printf("%d\n",ans);
}
int main()
{
freopen("input.txt","r",stdin);
// freopen("data.txt","r",stdin);
// freopen("out1.txt","w",stdout);
int t;
while(scanf("%d",&t)!=EOF)
{
a.ary[1]=t;
for(int i=2;i<=6;i++)
{
scanf("%d",&a.ary[i]);
}
for(int i=1;i<=6;i++)
{
scanf("%d",&b.ary[i]);
}
bfs();

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: