Dice (简单广搜)

题目来源:https://vjudge.net/problem/HDU-5012
【题意】
给出一个骰子两种状态,按照顺序给出各个面的数字(1~6),上,下,左,右,前,后,就这样输入两行数字,问能不能经过一些操作使骰子从第一个状态转移到第二个状态。操作只有四种,往前翻,往后翻,往左翻,往右翻。如果不行的话就输出-1(也就是队列为空时依旧找不到)。
【思路】
简单广搜,bfs内for循环四种操作,注意好数字在各个面的转移,然后广搜一套模板直接水过。
【代码】

#include
#include
#include
#include
#include
#include
#include
#include
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 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");
    }
}

你可能感兴趣的:(ACM竞赛,【搜索】--广搜,ACM的进程)