题目来源:https://vjudge.net/problem/HDU-5012
【题意】
给出一个骰子两种状态,按照顺序给出各个面的数字(1~6),上,下,左,右,前,后,就这样输入两行数字,问能不能经过一些操作使骰子从第一个状态转移到第二个状态。操作只有四种,往前翻,往后翻,往左翻,往右翻。如果不行的话就输出-1(也就是队列为空时依旧找不到)。
【思路】
简单广搜,bfs内for循环四种操作,注意好数字在各个面的转移,然后广搜一套模板直接水过。
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<iostream>
#include<map>
#include<queue>
using namespace std;
typedef long long LL;
int v[7][7][7][7][7][7];
int flag;
struct pp
{
int ao,ab,al,ar,af,ah;
int step;
} q1,q2;
void bfs(int x1,int x2,int x3,int x4,int x5,int x6)
{
queue<pp> q;
q1.ao=x1,q1.ab=x2,q1.al=x3,q1.ar=x4,q1.af=x5,q1.ah=x6;
v[q1.ao][q1.ab][q1.al][q1.ar][q1.af][q1.ah]=1;
q1.step=0;
q.push(q1);
while(!q.empty())
{
q1=q.front();
q.pop();
for(int i=0; i<4; i++)
{
if(i==0)
{
q2.ab=q1.ar;
q2.ar=q1.ao;
q2.ao=q1.al;
q2.al=q1.ab;
q2.af=q1.af;
q2.ah=q1.ah;
}
else if(i==1)
{
q2.ab=q1.al;
q2.al=q1.ao;
q2.ao=q1.ar;
q2.ar=q1.ab;
q2.af=q1.af;
q2.ah=q1.ah;
}
else if(i==2)
{
q2.ab=q1.af;
q2.af=q1.ao;
q2.ao=q1.ah;
q2.ah=q1.ab;
q2.al=q1.al;
q2.ar=q1.ar;
}
else if(i==3)
{
q2.ab=q1.ah;
q2.ah=q1.ao;
q2.ao=q1.af;
q2.af=q1.ab;
q2.al=q1.al;
q2.ar=q1.ar;
}
if(v[q2.ao][q2.ab][q2.al][q2.ar][q2.af][q2.ah]!=1)
{ q2.step=q1.step+1;
if(v[q2.ao][q2.ab][q2.al][q2.ar][q2.af][q2.ah]==2)
{
printf("%d\n",q1.step+1);
flag=1;
return;
}
q.push(q2);
v[q2.ao][q2.ab][q2.al][q2.ar][q2.af][q2.ah]=1;
}
}
}
}
int main()
{
int ao,ab,al,ar,af,ah,ao1,ab1,al1,ar1,af1,ah1;
while(cin>>ao>>ab>>al>>ar>>af>>ah)
{
memset(v,0,sizeof(v));
v[ao][ab][al][ar][af][ah]=1;
cin>>ao1>>ab1>>al1>>ar1>>af1>>ah1;
v[ao1][ab1][al1][ar1][af1][ah1]=2;
if(ao==ao1&&ab==ab1&&af==af1&&ah==ah1&&al==al1&&ar==ar1)
{
printf("0\n");
continue;
}
flag=0;
bfs(ao,ab,al,ar,af,ah);
if(!flag)
printf("-1\n");
}
}