【牛客CSP-S提高组赛前集训营1】A - 仓鼠的石子游戏【博弈论】

题目大意:

题目链接:https://ac.nowcoder.com/acm/contest/1100/A

仓鼠和兔子被禁止玩电脑,无聊的他们跑到一块空地上,空地上有许多小石子。兔子捡了很多石子,然后将石子摆成n个圈,每个圈由a[i]个石子组成。然后兔子有两根彩色笔,一支红色一支蓝色。兔子和仓鼠轮流选择一个没有上色的石子涂上颜色,兔子每次可以选择一个还未染色的石子将其染成红色,而仓鼠每次可以选择一个还未染色的石子将其染成蓝色,并且仓鼠和兔子约定,轮流染色的过程中不能出现相邻石子同色,谁不能操作他就输了。假设他们两个都使用了最优策略来玩这个游戏,并且兔子先手,最终谁会赢得游戏?


思路:

对于每一堆石子按顺时针编号。
如果先手在 i i i涂颜色,那么后手就在 i + 1 i+1 i+1涂颜色。如果后手不能在 i + 1 i+1 i+1上色那么只有 i + 2 i+2 i+2已经被后手上色的可能。但是由于后手保证一定在先手后面位置上色,所以如果 i + 2 i+2 i+2已经被后手上色,那么 i + 1 i+1 i+1必然已经被先手上色,那么先手就不可以在 i i i上色了。故先手每上一个色,后手必然也可以上色。
所以除了在只有一个石子的情况下,先手必败。
那么异或起来就好了。


代码:

#include 
using namespace std;
 
const int N=1010;
int n,T,ans,x;
 
int main()
{
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d",&n);
        ans=0;
        for (int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            ans^=(x==1);
        }
        if (ans==1) printf("rabbit\n");
            else printf("hamster\n");
    }
    return 0;
}

你可能感兴趣的:(博弈论)