找个算法

rjlly 2005-01-10 09:38:38
如果有n个棋子,甲乙两方轮流取棋子,每方至少取一个棋子,最多取m个棋子谁最后取剩下的一个棋子,谁就输,如果甲方先取,给出甲方赢的算法.
我正在学C语言,请给出C的描述或程序.谢谢!
...全文
157 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
rjlly 2005-01-12
  • 打赏
  • 举报
回复
难道没有人能给个思路吗?
lzxjxsy 2005-01-12
  • 打赏
  • 举报
回复
哦,不好意思,看反了,还以为拿到最后一个的算赢了。

不过思路一样:

1 . 甲第一次拿(n-1)%(m+1) 个,也就是n-1除以m+1的余数。
2. 甲以后每一次拿走的都是m+1-i, i为乙拿走的数目。因为甲第一次拿后,剩下总数-1必然是m+1的倍数。不管乙拿几个,m+1-i总是在1到m之间。所以,甲能让剩下的总数-1是m+1的倍数。所以,甲总能拿到倒数第二个子。
3 . 限制条件,就是(n-1) %(m+1)不能为0,甲才能必胜,就是说n-1不能使m+1整数倍。
lzxjxsy 2005-01-12
  • 打赏
  • 举报
回复
对上述思路的还有一点补充,

就是n 不能是 m+1的倍数。
lzxjxsy 2005-01-12
  • 打赏
  • 举报
回复
思路就是

1. 甲第一次拿n%(m+1) 个,也就是n除以m+1的余数。
2. 甲以后每一次拿走的都是m+1-i, i为乙拿走的数目。因为甲第一次拿后,剩下的必然是m+1的倍数。
不管乙拿几个,m+1-i总是在1到m之间。所以,甲能让剩下的总是m+1的倍数。
liem 2005-01-11
  • 打赏
  • 举报
回复
取走后留下的个数N满足:N mod m=1。因此先取的人必胜。
jdcb2001 2005-01-11
  • 打赏
  • 举报
回复
只要让对方拿第Total%(2*m)颗棋就胜券在握了:)
至于具体走法见机行事,只有先走就能赢.
如果还要用穷举把所有拿法都算出来,实在没意义了
jdcb2001 2005-01-11
  • 打赏
  • 举报
回复
如果n>>m,谁拿了倒数第(2m+1)颗棋谁就一定输;
同理,谁拿了倒数第(4m+1)颗谁就一定拿"倒数第(2m+1)颗棋"
……
chenyu17094256 2005-01-10
  • 打赏
  • 举报
回复
楼上思想N棒!

但是由于说得简单,难免不够全面。如果留下了m+1个子,那怎么办?
wasoxi 2005-01-10
  • 打赏
  • 举报
回复
在甲取的时候务必做到给乙留下的是>=m or = 1才能有取胜的机会
最后当然留下了当然是1了
那就对m ,n的大小关系判断了
取出i n = n - i;

应该就是这样了吧 具体的就自己去练练了
Roaming_Sheep 2005-01-10
  • 打赏
  • 举报
回复
我正在学C语言,请给出C的描述或程序.谢谢!
___________________________________________

既然正在学,就自己写。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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