POJ 3480 John Anti-Nim博弈变形

    xiaoxiao2021-03-25  80

    题目链接:这里 题意:有若干堆石子,两个人轮流从其中一堆里面取出若干个(不能不取),若某个人取完后没有石子了,则这个人输。先手的人叫John。 解法: 先手胜当且仅当 (1)所有堆石子数都为1且游戏的SG值为0 ,(2)存在某堆石子数大于1且游戏的SG值不为0 证明: (1)若所有堆石子数都为1且SG值为0,则共有偶数堆石子,故先手胜。 (2) i)只有一堆石子数大于1时,我们总可以对该堆石子操作,使操作后石子堆数为奇数且所有堆得石子数均为1 ii)有超过一堆石子数大于1时,先手将SG值变为0即可,且总还存在某堆石子数大于1

    //POJ 3480 /*先手胜当且仅当 (1)所有堆石子数都为1且游戏的SG值为0 ,(2)存在某堆石子数大于1且游戏的SG值不为0 证明: (1)若所有堆石子数都为1且SG值为0,则共有偶数堆石子,故先手胜。 (2) i)只有一堆石子数大于1时,我们总可以对该堆石子操作,使操作后石子堆数为奇数且所有堆得石子数均为1 ii)有超过一堆石子数大于1时,先手将SG值变为0即可,且总还存在某堆石子数大于1 */ #include <stdio.h> int main() { int T; scanf("%d", &T); while(T--){ int n; scanf("%d", &n); bool flag = 0; int sg = 0; for(int i = 1; i <= n; i++){ int x; scanf("%d", &x); sg ^= x; if(x > 1) flag = 1; } if(!sg && !flag) puts("John"); else if(flag && sg) puts("John"); else puts("Brother"); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-26202.html

    最新回复(0)