街头转盘游戏光输不赢俄罗斯转盘是什么意思原理

【图文】转盘游戏_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
上传于|0|0|暂无简介
大小:67.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢题解西电OJ (Problem 1006 - 转盘游戏)--动态规划 - OpenSolaris - 推酷
题解西电OJ (Problem 1006 - 转盘游戏)--动态规划 - OpenSolaris
题目链接 :&
Description
wm最近喜欢上一种无聊的转盘解锁游戏,他每天都会为这游戏消磨上三个小时的时间。这游戏由三个正六边形拼成,拼成后一共有13个点,其中有4个黑点和9个白点,如下图。每一步可以顺时针或逆时针转动三个六边形的任意一个60度,转动时六边形的顶点也会相应转动,而这游戏的目的是把四个黑点都转到中间(图中最后一个状态)。这是一个很简单的游戏,想达到游戏目的并不难,但wm觉得这样没挑战性,他决定对于任意一个初始状态,用最少的步数去玩这个游戏。
输入包含多组数据(500组),EOF结束。
每组数据都只有一行13个字符的01串,以从上到下,从左到右的点的顺序表示初始状态(这个由三个正六边形拼成图形最上面一排两个点编号为1 2,第二排三个点编号为3 4 5,依此类推,最后一个点编号为13。第一组样例为上图的初始状态),其中1表示黑点0表示白点。
每组数据输出一行,解出游戏需要的最小步数。
Sample Input
Sample Output
每个六边形,可以朝两个方向旋转,共有3个六边形,共每个状态可以变化到其他六个状态。
假设初始状态是S,剩下变换后的六个状态分别是S1, S2, S3, S4, S5, S6 。
一个状态最快旋转得到期望结果的最小次数假定是 Res[S], 那么有以下结论:
Res[S] = min{Res[S1], Res[S2],Res[S3],Res[S4], Res[S5],Res[S6]} &+ &1 &;
那么这个问题变得简单了,其实就是一个递归可以解决的问题。但是这不是ACM的精神,因为这个方法不是最优的,想想哪里可以优化,
递归的方法会出现大量的重复计算,因为S状态执行3次S1 和 执行3次S2后会得到相同的状态,为了避免这种重复的计算我们采用动态规划算法。
初始状态是期望的结果S=0x348 (二进制为 &0),0标示白色,1标示黑色,上图中1序号位置对应的2进制数字的最低位,依次类推。
初始的Res[0x348] = 0 ;
初始状态S[0] =&0x348 ;
然后分别计算,从S[0] 经过1次变换可得到的6种状态,这六种状态的Res为1,然后依次计算, 状态的最大数是0x1E00 (二进制为0)
附上代码实现:
#include &stdio.h&
// change status
int turn(int status,int op)
static int ops[6][6]={
{0, 2, 5, 8, 6, 3}, {0, 3, 6, 8, 5, 2},
{1, 3, 6, 9, 7, 4}, {1, 4, 7, 9, 6, 3},
{6, 8, 10, 12, 11, 9}, {6, 9, 11, 12, 10, 8}};
//// trans status to node status
int node[13]={} ;
for(i = 0 ; status&&=1) {
node[i++] = status & 1 ;
//// do operation , and get res
for(tmp = node[ops[op][i=0]]; i & 5 ; i++){
node[ops[op][i]] = node[ops[op][i+1]] ;
node[ops[op][5]] =
for(i = 0 ; i & 13 ; i++){
status |= node[i]&&
//int _tmain(int argc, _TCHAR* argv[])
int main()
///// the max number status is 0 , is 0x1E00
int status[int(0x1E01)] = {} ;
int res[int(0x1E01)] = {} ;
///// final status is 0 , is 0x348
res[int(0x348)] = 0 ;
status[0] = 0x348 ;
int s_sum = 1 ;
char str[13] = {};
///// Cal the res array
for(i = 0 ; i & s_ i++){
for(j = 0 ; j & 6 ; j++){
int next_s = turn(status[i],j);
if(res[next_s]&=0){
res[next_s] = res[status[i]] + 1 ;
status[s_sum++] = next_
///output answer
for(;scanf(&%s&,str)!=EOF;printf(&%d\n&,res[j])){
for(i = 0 , j = 0 ; i & 13 ; i++){
j |= (str[i]-'0')&&
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致【图文】转盘游戏_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
上传于|0|0|文档简介
大小:923.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢乘法口诀转盘游戏_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
&购买后可评价
您可以上传图片描述问题
联系电话:
请填写真实有效的信息,以便工作人员联系您,我们为您严格保密。
乘法口诀转盘游戏
|0|0|暂无简介
总评分3.9|
浏览量2608
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢}

我要回帖

更多关于 圆桌转盘的原理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信