HDU 5012 Dice
2014-09-15 19:01
309 查看
有一个六面骰子,有四种翻面方法,求由原状态到目标状态需要翻的最小次数
BFS:
DFS(由于需要判断骰子可以翻到所有情况(存在大量重复)来确定最小次数,故该方法效率太低,超时):
BFS:
#include <stdio.h> #include <string.h> #define MAXN 1024 struct Dice { int a[6]; int n; static int dir[4][6]; int value () { int sum = 0; for (int i = 0; i < 6; i ++) { sum *= 10; sum += a[i]; } return sum; } Dice rotation(int k) { Dice dice; for (int i = 0; i < 6; i ++) dice.a[i] = a[dir[k][i]]; return dice; } } queue[MAXN]; int Dice :: dir[4][6] = {{3, 2, 0, 1, 4, 5}, {2, 3, 1, 0, 4, 5}, {5, 4, 2, 3, 0, 1}, {4, 5, 2, 3, 1, 0}}; int values[MAXN], num; int aim[6]; bool judge (int k) { for (int i = 0; i < num; i ++) if (values[i] == k) return false; values[num ++] = k; return true; } int BFS () { int front = 0, rear = 1; queue[0].n = 0; while (front < rear) { Dice& dice = queue[front ++]; if (memcmp(dice.a, aim, sizeof(aim)) == 0) return dice.n; for (int i = 0; i < 4; i ++) { queue[rear] = dice.rotation(i); if (judge(queue[rear].value())) { queue[rear ++].n = dice.n + 1; } } } return -1; } int main() { //freopen ("in.txt", "r", stdin); while (~scanf ("%d", &queue[0].a[0])) { num = 0; for (int i = 1; i < 6; i ++) scanf ("%d", &queue[0].a[i]); for (int i = 0; i < 6; i ++) { scanf ("%d", &aim[i]); } printf ("%d\n", BFS()); } return 0; }
DFS(由于需要判断骰子可以翻到所有情况(存在大量重复)来确定最小次数,故该方法效率太低,超时):
#include <stdio.h> #include <string.h> #define MAXN 1024 typedef int Dice[6]; int dir[4][6] = {{3, 2, 0, 1, 4, 5}, {2, 3, 1, 0, 4, 5}, {5, 4, 2, 3, 0, 1}, {4, 5, 2, 3, 1, 0}}; int values[MAXN], sum; Dice begin, aim; bool judge (int k, int num) { for (int i = 0; i < num; i ++) if (values[i] == k) return false; return true; } int value (Dice& a) { int sum = 0; for (int i = 0; i < 6; i ++) { sum *= 10; sum += a[i]; } return sum; } void DFS (Dice& dice, int cur) { if (memcmp(dice, aim, sizeof(aim)) == 0 && (cur < sum || sum == -1)) { sum = cur; return; } Dice ndice; int k; for (int i = 0; i < 4; i ++) { for (int j = 0; j < 6; j ++) ndice[j] = dice[dir[i][j]]; k = value(ndice); if (judge(k, cur)) { values[cur] = k; DFS(ndice, cur + 1); } } } int main() { //freopen ("in.txt", "r", stdin); while (~scanf ("%d", &begin[0])) { sum = -1; for (int i = 1; i < 6; i ++) scanf ("%d", &begin[i]); for (int i = 0; i < 6; i ++) { scanf ("%d", &aim[i]); } DFS(begin, 0); printf ("%d\n", s 4000 um); } return 0; }
相关文章推荐
- HDU-#5012 Dice(BFS)
- BFS + 剪枝 之 hdu 5012 Dice
- hdu 5012——Dice
- hdu 5012 Dice BFS 2014 ACM/ICPC Asia Regional Xi'an Online
- 【搜索】 HDU 5012 Dice
- BFS + 剪枝 之 hdu 5012 Dice
- HDU 5012 Dice (BFS)
- HDU 5012 Dice bfs
- hdu 5012 Dice 2014 ACM/ICPC Asia Regional Xi'an Online
- HDU5012 Dice
- 【搜索】 HDU 5012 Dice
- HDU 5012-Dice(BFS)
- hdu 5012 Dice 【Dfs】
- HDU 5012 Dice (bfs + 记忆化搜索)
- hdu 5012 Dice(隐式图搜索)
- HDU - 5012 Dice
- hdu 5012 Dice
- HDU 5012 Dice
- ACM学习历程—HDU 5012 Dice(ACM西安网赛)(bfs)
- HDU - 5012 Dice(bfs+hash)