【POJ1704】Georgia and Bob (staircase Nem 变形题)

Categories: 数据结构和算法
Comments: No Comments
Published on: 2011 年 04 月 11 日

poj的discuss里边说的题解十分到位:

这道题目可以对应一个Staircase NIM问题,只需要把两个棋子之间的间隔以及第一个棋子与左边界的间隔看作一堆石子,
则一次操作一定是从一对石子中取出若干移到右边相邻的一堆中。这就是标准的Staircase-NIM问题。
具体的做法是:将所有奇数位置上的石子个数做XOR,结果为0说明BOB胜,否则说明GEORGIA胜,Not Sure显然是不会出现的。
分析:
如果只考虑奇数位上,把奇数位上的硬币放入偶数位,看做nim的取石子游戏。
那么这是我们类似可以得到奇数位的SG函数。如果我们可以做到使SG=0.

那么如果对方在奇数位上取硬币,那么我们也类似nim在奇数位上取硬币使SG值回到0;

如果对方在偶数位上取硬币。那么我们就把他刚刚从偶数位上传到奇数位上的硬币数。

原封不动的再传回偶数位。这样就可以保持SG=0;

从而保证自己必胜~

#include<cstdio>  
#include <algorithm>  
using namespace std;  
int stairs[1002];  
int main()  
{  
    freopen("1.txt","r",stdin);  
    int n,temp,ans,sumcount;  
    scanf("%d",&n);;  
    while(n--)  
    {  
        scanf("%d",&sumcount);  
        stairs[sumcount]=0;  
        for (int i=0;i<sumcount;i++)  
        {  
            scanf("%d",&stairs[i]);  
        }  
        sort(stairs,stairs+sumcount+1);  
        ans=0;  
        for (int i=sumcount;i>0;i--,i--)  
        {  
            temp=stairs[i]-stairs[i-1]-1;  
            ans^=temp;  
        }  
        if (ans)  
            puts("Georgia will win");  
        else  
            puts("Bob will win");  
    }  
}  

staircase nim 经典组合游戏

游戏开始时有许多硬币任意分布在楼梯上,共n阶楼梯从地面由下向上编号为0到n。游戏者在每次操作时可以将楼梯j(1<=j<=n)上的任意多但至少一个硬币移动到楼梯j-1上。游戏者轮流操作,将最后一枚硬币移至地上的人获胜。 分析: 这个问题与nim游戏的区别在于移走的硬币不是被扔掉而是被放进了另一堆硬币之中,考虑能否将这一部分楼梯排除考虑范围。奇数号楼梯只能将硬币扔到偶数号楼梯之中,同样偶数号楼梯上的硬币也只会被扔上奇数号楼梯。只考虑奇数号楼梯nim,若偶数楼梯只作容器,那么游戏变为nim。当偶数号楼梯上的硬币可以将硬币移出时,我们是不是仍然可以用nim的方法判断必败状态? 将奇数台阶的硬币数nim和为0称作条件A,结束状态满足条件A;任何满足条件A的状态都到达满足条件A的状态;任何不满足条件A的状态都可以到达满足条件A的状态(nim)。因此一个状态为必败状态当且仅当它满足条件A

我猜你可能也喜欢:

No Comments - Leave a comment

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>


Welcome , today is 星期六, 2017 年 10 月 21 日