HDU 5012 Dice

来源:互联网 发布:java web创意项目 编辑:程序博客网 时间:2024/05/17 06:40

Dice

题目链接

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=98233#problem/B

题意:

给你两个骰子的序列(上下左右前后),通过左右上下的旋转方式使得两个骰子完全一样,求最小的步数,如不能达到输出-1。一开始把骰子转动的方向搞错了,一直错。

大致思路:

还是用BFS,隐式的广度搜索,用字符串存骰子序列。把每次翻转过的骰子的新序列加入到队列中,如果某一次从队列中取出的骰子序列与结果序列相同,表明找到,此时这个骰子序列就是经过最小翻转次数得到的,输出此时的次数就可以了。需要注意的是判重,开了一个700000的bool型数组(bool vis[700000]),把骰子序列转换成int型整数作为对应数组下标,例如骰子序列”123456”,如果这个骰子序列出现过,那么vis[123456]=true;表示访问过。

代码

#include<stdio.h>#include<stdlib.h>#include<iostream>#include<cstring>#include<queue>using namespace std;char in[11];bool vis[700000];bool flag;struct node{    int count;    char num[11];};node diceEnd;int minCount;void BFS(char *in){    queue<node> q;    node dice;    dice.count = 0;    strcpy(dice.num,in);    q.push(dice);    vis[atoi(in)] = true;    while (!q.empty())    {        node dice1 = q.front();        if (strcmp(dice1.num, diceEnd.num) == 0)        {            flag = true;            minCount = dice1.count;            return;        }        q.pop();        for (int i = 0; i < 4; i++)        {            char temp[11];            temp[6] = '\0';            if (i == 0)//向下            {                temp[0] = dice1.num[5];                temp[1] = dice1.num[4];                temp[2] = dice1.num[2];                temp[3] = dice1.num[3];                temp[4] = dice1.num[0];                temp[5] = dice1.num[1];            }            else if (i == 1)//向上            {                temp[0] = dice1.num[4];                temp[1] = dice1.num[5];                temp[2] = dice1.num[2];                temp[3] = dice1.num[3];                temp[4] = dice1.num[1];                temp[5] = dice1.num[0];            }            else if (i == 2)//向左            {                temp[0] = dice1.num[2];                temp[1] = dice1.num[3];                temp[2] = dice1.num[1];                temp[3] = dice1.num[0];                temp[4] = dice1.num[4];                temp[5] = dice1.num[5];            }            else if (i == 3)//向右            {                temp[0] = dice1.num[3];                temp[1] = dice1.num[2];                temp[2] = dice1.num[0];                temp[3] = dice1.num[1];                temp[4] = dice1.num[4];                temp[5] = dice1.num[5];            }            int tmp = atoi(temp);            if (!vis[tmp])            {                node dice2;                dice2.count = dice1.count + 1;                strcpy(dice2.num,temp);                q.push(dice2);                vis[tmp] = true;            }        }    }}int main(){    while (cin >> in[0])    {        diceEnd.count = 0;        memset(diceEnd.num,0,sizeof(diceEnd.num));        memset(vis,0,sizeof(vis));        flag = false;        for (int i = 1; i < 6; i++)        {            cin >> in[i];        }        diceEnd.num[6] = '\0';        for (int i = 0; i < 6; i++)        {            cin >> diceEnd.num[i];        }        //BFS        BFS(in);        if (flag)        {            printf("%d\n",minCount);        }        else        {            printf("-1\n");        }    }    return 0;}
0 0
原创粉丝点击