HDU 5012 Dice 普通bfs

题意:有两个六面骰子,六个面分别用a1,a2,a3,a4,a5,a6(:上下左右前后)表示,骰子可以按底面的四条边为轴旋转90°,问把一个骰子转成另一个的最少步骤。


想法:找好转的方向,及a1-a6的变化即可。简单画画就好了。然后就是简单的搜索。


#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
struct node
{
    int sta[7];
    int step;
};
bool vis[7][7][7][7][7][7];
node exchange(int dir,node z)
{
    node p;
    if(dir==0)
    {
        p.sta[1]=z.sta[4];
        p.sta[2]=z.sta[3];
        p.sta[3]=z.sta[1];
        p.sta[4]=z.sta[2];
        p.sta[5]=z.sta[5];
        p.sta[6]=z.sta[6];
    }
    else if(dir==1)
    {
        p.sta[1]=z.sta[3];
        p.sta[2]=z.sta[4];
        p.sta[3]=z.sta[2];
        p.sta[4]=z.sta[1];
        p.sta[5]=z.sta[5];
        p.sta[6]=z.sta[6];
    }
    else if(dir==2)
    {
        p.sta[1]=z.sta[6];
        p.sta[2]=z.sta[5];
        p.sta[3]=z.sta[3];
        p.sta[4]=z.sta[4];
        p.sta[5]=z.sta[1];
        p.sta[6]=z.sta[2];
    }
    else if(dir==3)
    {
        p.sta[1]=z.sta[5];
        p.sta[2]=z.sta[6];
        p.sta[3]=z.sta[3];
        p.sta[4]=z.sta[4];
        p.sta[5]=z.sta[2];
        p.sta[6]=z.sta[1];
    }
    return p;
}
void bfs(node a,node b)
{
    node head,nxt;
    queue<node>q;
    while(!q.empty()) q.pop();
    memset(vis,false,sizeof(vis));
    head=a;head.step=0;
    vis[a.sta[1]][a.sta[2]][a.sta[3]][a.sta[4]][a.sta[5]][a.sta[6]]=true;
    q.push(head);
    int num=1;
    while(!q.empty())
    {
        head=q.front();
        q.pop();
        //cout<<head.step<<":"<<head.sta[1]<<" "<<head.sta[2]<<" "<<head.sta[3]<<" "<<head.sta[4]<<" "<<head.sta[5]<<" "<<head.sta[6]<<endl;
        if(head.sta[1]==b.sta[1]&&
           head.sta[2]==b.sta[2]&&
           head.sta[3]==b.sta[3]&&
           head.sta[4]==b.sta[4]&&
           head.sta[5]==b.sta[5]&&
           head.sta[6]==b.sta[6])
        {
            printf("%d\n",head.step);
            return;
        }
        for(int k=0;k<4;k++)
        {
            nxt=head;
            nxt=exchange(k,nxt);
            nxt.step=head.step+1;
            if(!vis[nxt.sta[1]][nxt.sta[2]][nxt.sta[3]][nxt.sta[4]][nxt.sta[5]][nxt.sta[6]])
            {
                vis[nxt.sta[1]][nxt.sta[2]][nxt.sta[3]][nxt.sta[4]][nxt.sta[5]][nxt.sta[6]]=true;
                q.push(nxt);
            }
        }
    } 
    printf("-1\n");
    return;
}
int main()
{
    node start,end;
    while(cin>>start.sta[1])
    {
        for(int i=2;i<=6;i++)
        cin>>start.sta[i];
        for(int i=1;i<=6;i++)
        cin>>end.sta[i];
        bfs(start,end);
    }    
    return 0;
}

你可能感兴趣的:(HDU 5012 Dice 普通bfs)