您的位置:首页 > 其它

HDU 5012 Dice

2015-11-05 13:59 429 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符串 搜索 bfs hdu 5012