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
- hdu 5012 Dice
- HDU 5012 Dice
- hdu 5012 dice
- 【搜索】 HDU 5012 Dice
- HDU 5012 Dice
- hdu 5012 Dice
- HDU 5012-Dice(BFS)
- Dice - HDU 5012 搜索
- HDU 5012 Dice bfs
- hdu 5012 Dice
- HDU - 5012 Dice BFS
- HDU - 5012 Dice
- HDU 5012 Dice
- hdu 5012 Dice 【Dfs】
- bfs-HDU 5012Dice
- Dice HDU 5012
- HDU 5012 Dice (bfs)
- hdu 5012——Dice
- C# 中动态调用C++动态链接
- AsyncTask的执行流程及其细节点
- 筛法求素数
- 生成有数字和字母生成的不重复的验证码
- 开发神器-Android Studio插件
- HDU 5012 Dice
- iOS开发中如何实现app作为外设被连接的功能?
- Java Exception 捕获和展示
- 【构】从游戏Buff谈装饰者模式那些事儿
- 前端架构之简洁的工作流
- more--每天一个-02
- Python - 迭代(for...in...:)
- iOS tableView点击分区下拉单元格特效
- 机器学习复习——KNN