题意:有两个六面的骰子,上面写着1~6。每一步只能向左,右,前,后滚,问最少需要滚几次才能使两个骰子六面完全相同。
思路:BFS。简单写个哈希判重,很轻松就搜过了。
#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
struct node{
int val[6];
};
node s,t;
node L(node& n){
node re;
re.val[4]=n.val[4]; re.val[5]=n.val[5];
re.val[0]=n.val[3]; re.val[3]=n.val[1];
re.val[1]=n.val[2]; re.val[2]=n.val[0];
return re;
}
node R(node& n){
node re;
re.val[4]=n.val[4]; re.val[5]=n.val[5];
re.val[3]=n.val[0]; re.val[1]=n.val[3];
re.val[2]=n.val[1]; re.val[0]=n.val[2];
return re;
}
node F(node& n){
node re;
re.val[2]=n.val[2]; re.val[3]=n.val[3];
re.val[0]=n.val[5]; re.val[5]=n.val[1];
re.val[1]=n.val[4]; re.val[4]=n.val[0];
return re;
}
node B(node& n){
node re;
re.val[2]=n.val[2]; re.val[3]=n.val[3];
re.val[5]=n.val[0]; re.val[1]=n.val[5];
re.val[4]=n.val[1]; re.val[0]=n.val[4];
return re;
}
int n2i(node& n){
int re=0;
for(int i=0;i<6;i++){
re*=7;
re+=n.val[i];
}
return re;
}
int dis[120000];
int main(){
while(cin>>s.val[0]>>s.val[1]>>s.val[2]>>s.val[3]>>s.val[4]>>s.val[5]){
memset(dis,-1,sizeof(dis));
for(int i=0;i<6;i++){
cin>>t.val[i];
}
int ss=n2i(s);
int tt=n2i(t);
queue<node> que; que.push(s);
dis[ss]=0;
int ans=-1;
while(!que.empty()){
node cur=que.front(); que.pop();
node nd;
if(n2i(cur)==tt){
ans=dis[n2i(cur)];
break;
}
nd=L(cur);
if(-1==dis[n2i(nd)]){
dis[n2i(nd)]=dis[n2i(cur)]+1;
que.push(nd);
}
nd=R(cur);
if(-1==dis[n2i(nd)]){
dis[n2i(nd)]=dis[n2i(cur)]+1;
que.push(nd);
}
nd=F(cur);
if(-1==dis[n2i(nd)]){
dis[n2i(nd)]=dis[n2i(cur)]+1;
que.push(nd);
}
nd=B(cur);
if(-1==dis[n2i(nd)]){
dis[n2i(nd)]=dis[n2i(cur)]+1;
que.push(nd);
}
}
cout<<ans<<endl;
}
return 0;
}
本文探讨了两个六面骰子通过翻转达到状态一致所需的最少步骤问题。采用BFS算法进行搜索,并利用哈希技术避免重复状态,最终实现高效求解。
592

被折叠的 条评论
为什么被折叠?



