关于搬山游戏的算法题

leavemaple 2010-06-16 04:02:47
题目:设有n座山,计算机与人作为比赛的双方,双方轮流搬山。规定每次搬山的数目不能超过k座,谁搬最后一座谁输,每次允许搬山的最大数目(k)。谁都可以先开始搬,双方轮流搬山直到最后一座山搬完为止。

这是题目,设计一个程序不难,简单点,我们假设总数n=100,k=10。

下边是难题,如何设一个计算机的搬山算法,不论在谁先开始搬的情况下,都是计算机获胜?

欢迎大家讨论啊。
...全文
474 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色夹克衫 2010-06-18
  • 打赏
  • 举报
回复
这个不可能,如果mod 11 = 0的话,只要对方不犯错,先手肯定会输的。
不过可以把规则弄复杂一些,是人都会犯错误的。

[Quote=引用 19 楼 leavemaple 的回复:]
大家还有没有更好的意见,最好附上实现代码。暂时不结贴,大家踊跃讨论讨论,可以扩展思维的,呵呵。
我在12楼不是已经给出答案了吗?
把文字描述翻译成代码不会吗?

当k=10 就是mod 11了吧。 我知道这个规律,我意思是说不管怎么样,能不能总让一方赢呢?就算 mod 11=0的情况出现……
[/Quote]
jimh 2010-06-18
  • 打赏
  • 举报
回复
不可能100%赢的,胜率看m,先手的胜率为m/(m+1),后手的胜率为1/(m+1),m一般要大于1,所以,m越大,先手的胜率就越大,但不管如何,先手的胜率都大于50%。
leavemaple 2010-06-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 leavemaple 的回复:]
引用 18 楼 litaoye 的回复:
这个用笔就可以算,100和10的话,只要求mod 11就好,mod 11 = 0的话,先手负,否则先手胜。
100 % 11 = 1,所以先拿的赢,先拿1个,之后无论对手拿多少个(设为k个),你就拿11 - k个,最后就赢了。
这个属于最简单的nim问题,还有许多复杂的变化,比如只可以拿2的幂......


引用 14 楼 leavemapl……
[/Quote]

是啊,当时我就想了, 如果 k=10的时候 如果 mod 11 = 0 ,那就必输无疑了。哎,看来又是个无解了哦。
leavemaple 2010-06-18
  • 打赏
  • 举报
回复
哎,早就料到是这个结局了,那天想了一晚上,都感觉不可能100%,结贴吧。
aimeast 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 leavemaple 的回复:]

大家还有没有更好的意见,最好附上实现代码。暂时不结贴,大家踊跃讨论讨论,可以扩展思维的,呵呵。
[/Quote]我在12楼不是已经给出答案了吗?
把文字描述翻译成代码不会吗?
leavemaple 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 litaoye 的回复:]
这个用笔就可以算,100和10的话,只要求mod 11就好,mod 11 = 0的话,先手负,否则先手胜。
100 % 11 = 1,所以先拿的赢,先拿1个,之后无论对手拿多少个(设为k个),你就拿11 - k个,最后就赢了。
这个属于最简单的nim问题,还有许多复杂的变化,比如只可以拿2的幂......


引用 14 楼 leavemaple 的回复:

引用 11 楼 leav……
[/Quote]

不好意思,LS引错了,应该引18楼的。。。
leavemaple 2010-06-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 aimeast 的回复:]
引用 16 楼 leavemaple 的回复:

大家还有没有更好的意见,最好附上实现代码。暂时不结贴,大家踊跃讨论讨论,可以扩展思维的,呵呵。
我在12楼不是已经给出答案了吗?
把文字描述翻译成代码不会吗?
[/Quote]
当k=10 就是mod 11了吧。 我知道这个规律,我意思是说不管怎么样,能不能总让一方赢呢?就算 mod 11=0的情况出现了? 是不是无解了?
绿色夹克衫 2010-06-17
  • 打赏
  • 举报
回复
这个用笔就可以算,100和10的话,只要求mod 11就好,mod 11 = 0的话,先手负,否则先手胜。
100 % 11 = 1,所以先拿的赢,先拿1个,之后无论对手拿多少个(设为k个),你就拿11 - k个,最后就赢了。
这个属于最简单的nim问题,还有许多复杂的变化,比如只可以拿2的幂......

[Quote=引用 14 楼 leavemaple 的回复:]

引用 11 楼 leavemaple 的回复:
引用 9 楼 leavemaple 的回复:
其实如果把数字设置大 n=100 k=99的话

必定先搬的赢

我们假设k < n/2 -1 不考虑上边特殊情况

会不会有算法让计算机必胜呢

如果正常情况下 计算的搬山数量应该是 (剩余的山-1)/(k+1) 如果结果为0 就搬1个。

但是这种情况不能保证计算机必胜。
……
[/Quote]
leavemaple 2010-06-16
  • 打赏
  • 举报
回复
大家还有没有更好的意见,最好附上实现代码。暂时不结贴,大家踊跃讨论讨论,可以扩展思维的,呵呵。
jimeixuehua 2010-06-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zbc496218 的回复:]
每天回帖即可获得10分可用分
[/Quote]
amoeet 2010-06-16
  • 打赏
  • 举报
回复
按公式计算?这样就不叫游戏了,只是一个演算器~~

应该能写出公式吧~~类似的规律什么的
jsonzbc 2010-06-16
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
xiaod1986 2010-06-16
  • 打赏
  • 举报
回复
过来学习!!
wuyq11 2010-06-16
  • 打赏
  • 举报
回复
就是循环操作,n每次减k,当n<10时谁操作时谁获胜
spmzfz 2010-06-16
  • 打赏
  • 举报
回复
但这样一样来就不是 要求都是计算机获胜 的了。
spmzfz 2010-06-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 caozhy 的回复:]

下边是难题,如何设一个计算机的搬山算法,不论在谁先开始搬的情况下,都是计算机获胜?

那计算机和计算机对垒呢?那人按照程序慢慢演算代替电脑呢?
[/Quote]

嗯,呵呵,那应该是先“搬”的那个“计算机/人”要获胜。
threenewbee 2010-06-16
  • 打赏
  • 举报
回复
下边是难题,如何设一个计算机的搬山算法,不论在谁先开始搬的情况下,都是计算机获胜?

那计算机和计算机对垒呢?那人按照程序慢慢演算代替电脑呢?
changjin642 2010-06-16
  • 打赏
  • 举报
回复
占个沙发先。
leavemaple 2010-06-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 leavemaple 的回复:]
引用 9 楼 leavemaple 的回复:
其实如果把数字设置大 n=100 k=99的话

必定先搬的赢

我们假设k < n/2 -1 不考虑上边特殊情况

会不会有算法让计算机必胜呢

如果正常情况下 计算的搬山数量应该是 (剩余的山-1)/(k+1) 如果结果为0 就搬1个。

但是这种情况不能保证计算机必胜。

什么扑克牌。。。
[/Quote]

这个可以推算出来我上面的公式吧?我是说不管谁先开始,都让计算机获胜,可以吗?100个东西,一次最多10个。能写个算法,永远让计算获胜么?
z5503317 2010-06-16
  • 打赏
  • 举报
回复
ls牛人啊...
加载更多回复(4)

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧