hdu1729 Stone Game-sg函数

题目大意:(取石子游戏)有n个箱子,体积为Si,当前箱子里的石子数为Ci。两个人轮流往箱子里放石子,而且每一次放是数量都有限制,不能超过当前箱子内石子数的平方。例如箱子里有3颗石子,那么下一个人就可以放1~9颗石子,直到箱子被装满。当有一方放不下石子时游戏结束,最后放不下石子的人输。

思路:一、设当前的箱子容量为si,求出一个t满足:t + t * t < si,如果当前箱子里有ci颗石头,

1、ci > t 则必胜;

2、ci == t 则必败;

3、ci < t不能确定,将t作为si递归调用函数。

当满足ci > t时,return si - ci 作为当前状态的sg值。因为:

如图:

hdu1729 Stone Game-sg函数_第1张图片

当ci在si点时,为有向图的端点,出度为0,也就是必败点,所以sg值为0;

当ci 位于si - 1时,ci的端点可能的sg值构成的集合为{0},所以当前sg值 为1;

当ci 位于si - 2 时,ci的端点可能的sg值构成的集合为{0, 1},所以当前的sg值为2;

可得,ci所在位置的sg值为si - ci;

二 ,当ci

sg[t+1],sg[t+2],.....,所以此时sg[si]==sg[t];

#include
#include
int sg(int c,int s)
{
    int k=sqrt(s*1.0);
    while(k+k*k>=s) k--;
    if(k



你可能感兴趣的:(博弈论-sg函数)