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; }
相关文章推荐
- 数据库链接字符串查询网站
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- Flex字符串比较 还有Flex字符串操作
- Ruby中创建字符串的一些技巧小结
- ASP下经常用的字符串等函数参考资料
- 将字符串小写转大写并延时输出的批处理代码
- 将字符串转换成System.Drawing.Color类型的方法
- Lua源码中字符串类型的实现
- Lua性能优化技巧(四):关于字符串
- 字符串聚合函数(去除重复值)
- Ruby中的字符串编写示例
- 总结的5个C#字符串操作方法分享
- sqlserver中求字符串中汉字的个数的sql语句
- sql server字符串非空判断实现方法
- VBS的字符串及日期操作相关函数
- C#实现将千分位字符串转换成数字的方法
- jquery 删除字符串最后一个字符的方法解析
- PowerShell实现在字符串中查找大写字母