取石子游戏c语言

小鬼_CHEN 2007-02-11 02:49:09
Problem Description


有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。


Input


输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000。


Output


输出对应也有若干行,每行包含一个数字1或0,如果最后你是胜者,则为1,反之,则为0。


Sample Input


2 1
8 4
4 7
Sample Output


0
1
0
...全文
834 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
softwarewander 2007-02-12
  • 打赏
  • 举报
回复
可以用递归来做,
假设 有A,B两堆石子。 A的数量是x,B的是y

递归的出口是3个状态。
1:其一等于1,另一个等于2 (输)
2:其一等于1,另一个>2 (赢)
3:其一等于2,另一个>1 (赢)

另外,只需要定义操作了, 操作只能是两者之一。 其一:(de_both)两堆都减去同一数字的石子。另外一个(de_one)就是人选一堆,拿掉任意个数的石子。

递归过程如下;
void simulate(int a,int b)
{
switch(state)
{
case 1:
you lose;
case 2:
break;
case 3:
you win;
}
if(abs(a,b)=1) /*这时候一定能赢*/
{
de_both(min(a,b)-1); /*两边都取走两者中最小数-1个石子,形成状态1的形式*/
}
else
{
de_one(random); /*这里的random只需要不使两者之差=1即可*/
}
simulate(a,b);
}


dead_of_winter 2007-02-11
  • 打赏
  • 举报
回复
大概说一下吧
先从最简单的情况入手
相等 先拿必赢
1,2 必输
1,n>2必赢
n>1,2必赢
1+n,2+n(n>0)必赢
3,5必输(关键)
依此类推
4,7必输
6,10必输
8,13必输
思路大概是这个样子了

小鬼_CHEN 2007-02-11
  • 打赏
  • 举报
回复
博弈问题
这怎么理解啊?
dead_of_winter 2007-02-11
  • 打赏
  • 举报
回复
acm题哈 自己去北大acm看讨论吧
小鬼_CHEN 2007-02-11
  • 打赏
  • 举报
回复
怎么用c来表述??谢谢!

69,371

社区成员

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

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