社区
C#
帖子详情
关于搬山游戏的算法题
leavemaple
2010-06-16 04:02:47
题目:设有n座山,计算机与人作为比赛的双方,双方轮流搬山。规定每次搬山的数目不能超过k座,谁搬最后一座谁输,每次允许搬山的最大数目(k)。谁都可以先开始搬,双方轮流搬山直到最后一座山搬完为止。
这是题目,设计一个程序不难,简单点,我们假设总数n=100,k=10。
下边是难题,如何设一个计算机的搬山算法,不论在谁先开始搬的情况下,都是计算机获胜?
欢迎大家讨论啊。
...全文
554
24
打赏
收藏
关于搬山游戏的算法题
题目:设有n座山,计算机与人作为比赛的双方,双方轮流搬山。规定每次搬山的数目不能超过k座,谁搬最后一座谁输,每次允许搬山的最大数目(k)。谁都可以先开始搬,双方轮流搬山直到最后一座山搬完为止。 这是题目,设计一个程序不难,简单点,我们假设总数n=100,k=10。 下边是难题,如何设一个计算机的搬山算法,不论在谁先开始搬的情况下,都是计算机获胜? 欢迎大家讨论啊。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
100个python
算法
超详细讲解:
搬山
游戏
【100个python
算法
超详细讲解】@谷歌学术1.问
题
描述 设有n座山,计算机与人作为比赛的双方,轮流
搬山
。规定每次搬 山数不能超过k座,谁搬最后一座谁输。
游戏
开始时,计算机请人输入 山的总数n和每次允许
搬山
的最大数k,然后请人开始,等人输入了需 要搬走的山的数目后,计算机马上打印出它搬多少座山,并提示尚余 多少座山。双方轮流
搬山
直到最后一座山搬完为止。计算机会显示谁 是赢家,并问人是否要继续比赛。如果人不想玩了,计算机便会统计 出共玩了几局,双方胜负如何。 2.问
题
分析 程序结构: 程序中先输入山的座数
pip-ansys_mapdl_reader-0.52.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.zip
pip-ansys_mapdl_reader-0.52.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.zip
stm32单片机项目资料课程设计文档C语言程序代码原理图电路PCB实例桑塔纳2000型轿车电路分析
stm32单片机项目资料课程设计文档C语言程序代码原理图电路PCB实例桑塔纳2000型轿车电路分析
Windows 系统部署 Milvus(米尔沃斯)向量数据库完整教程:更新 wsl
Windows 系统部署 Milvus(米尔沃斯)向量数据库完整教程:更新 wsl
C#
111,129
社区成员
642,534
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章