取石子游戏博弈推导

题目:

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

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

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

题解:行和列分别表示两堆石子的起始数量,0表示 遇上必输局面,1表示遇上比赢局面。用类似动态规划填表的形式推理输赢状态转换

得到结果:0表示聪明必输状态,1表示聪明必赢状态

分析:

如果双方都采取最佳下棋策略,则石堆中初始石子数量就决定了选手输赢。

假设两堆石子的数量分别为a和b,其中a>=0且b>=0。

在二维图中第a行第b列表示:状态(a,b)

我们已知最简单的状态:(0,0)-》必输状态0 ;(0,N+)或(N+,0)-》必胜状态

1.状态(a,b)通过一次操作可以转换到绿色状态中的某一种,绿色状态为(a,b)的较简单状态。

如果状态(a,b)的绿色区域(一次操作)有0,表明可以通过一次操作使对手处于必败局面,则状态(a,b)赋值为1,为必胜状态

如果状态(a,b)的绿色区域(一次操作)无0,表明不存在可使对手处于必败局面的一次操作,任何一种操作都使对手面临必胜状态,则状态(a,b)赋值为0,为必败状态

2.如果状态(a,b)已经确定为必败状态,那么所有可以通过一次操作转换到(a,b)的状态为蓝色区域;

蓝色区域的状态因为可以一次操作使对方面临必败状态,所以所有蓝色区域的状态均为必胜状态

经过推导可以得到:

可以看到,为0的状态(a,b)有:

0,0;1,2;2,1;3,5;4,7;5,3; 6,10; 7,4; 8,13; 9,15; 10,6; 11,18; 12,20; 13,8;  14,?;  15,9; 16,?; 17,?; 18,11; 19,?; 20,11;

观察上面推导图发现,对于为0的状态(a,b):对于每个自然数x,x都将在a中出现一次,x都将在b中出现一次。并在出现之后分别把把x行和x列剩余状态置为1(必胜状态)。

在为0状态(a,b)中取a<b,有:

1,2 ;3,5;4,7;6,10;8,13,; 9,15;11,18;12,20;

b-a为:1,2,3,4,5,6,7,8

本题的分析用动态规划的思想填表,但是数据比较大。还是不行。

原文地址:https://www.cnblogs.com/huangzq/p/3065819.html