南京理工大学第八届程序设计大赛(校外镜像) H谁才是最强战舰!

本文探讨了在特定游戏规则下的石子博弈策略,通过分析游戏状态与二进制异或运算的关系,揭示了如何判断游戏胜负的关键逻辑,提供了一种有效的方法来预测并决定胜利者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

依阿华来到镇守府的第一件事情,就是找大和solo!
然而这并不是什么好消息,说不定,镇守府,甚至佐伯湾就这么消失了。。。
于是,提督君想了一个简单的游戏,来分出她们的胜负。游戏规则如下:这里有N堆石子,每堆石子有a[i](1<=i<=N)个,每人轮流从其中的某一堆石子中拿出任意个石子(只能在其中一堆拿,不能不拿),大和先手,谁拿出了最后一个石子,谁输。若大和必胜,输出“Yamato_Saikou!”,若依阿华必胜,输出“Meidikeji_Shijiediyi!”,若两边都无法必胜,输出“Sayonara_Konosekai!”.

Input

第一行输入一个正整数T(1 <= T <= 1000),表示有T组测试数据。
对于每组测试数据:
第一行一个正整数,N(N<=1000),表示有N堆石子。
第二行N个整数a[i](1<=a[i]<=1000),表示每堆石子的数量。

Output

若大和必胜,输出“Yamato_Saikou!”,若依阿华必胜,输出“Meidikeji_Shijiediyi!”,若两边都无法必胜,输出“Sayonara_Konosekai!”.

Sample Input

3
1
5
2
1 2
3
1 1 1

Sample Output

Yamato_Saikou!
Yamato_Saikou!
Meidikeji_Shijiediyi!

思路:

尼姆博奕(Nimm Game)
指的是这样的一个博弈游戏,目前有任意堆石子,每堆石子个数也是任意的,双方轮流从中取出石子,规则如下:
1)每一步应取走至少一枚石子;每一步只能从某一堆中取走部分或全部石子;
2)如果谁取到最后一枚石子就胜(败)。
也就是尼姆博弈(Nimm Game)。
必败局面:也叫奇异局势。无论做出何出操作,最终结果都是输的局面。必败局面经过2次操作后,可以达到另一个必败局面。
必胜局面:经过1次操作后可以达到必败局面。
即当前局面不是必败局面就是必胜局面,而必胜局面可以一步转变成必败局面。
最终状态
(1)最后剩下一堆石子;(必胜局面)
(2)剩下两堆,每堆一个;(必败局面)
(3)当石子剩下两堆,其中一堆只剩下1颗,另一堆剩下多于n颗石子时,当前取的人只需将多于1颗的那一堆取出n-1颗,则局面变为刚才提到的必败局面。(必胜局面)
判断当前局势是否为必胜(必败)局势:
1)把所有堆的石子数目用二进制数表示出来,当全部这些数按位异或结果为0时当前局面为必败局面,否则为必胜局面;(证明略)
2)在必胜局面下,因为所有数按位异或的结果是大于零的,那么通过一次取,将这个(大于其它所有数按位异或的结果的)数下降到其它所有数按位异或的结果,这时局面就变为必败局面了

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        int n;
        scanf("%d", &n);
        int cnt=0,flag=1;
        for(int i=0;i<n;i++)
        {
            int k;
            scanf("%d",&k);
            if(k!=1) flag=0;
            cnt ^= k;
        }
        if(flag==0)
        {
            if(cnt) printf("Yamato_Saikou!\n");
            else printf("Meidikeji_Shijiediyi!\n");
        }
        else//如果每堆石子都是1,按堆数分奇数偶数,直接可以判断
        {
            if(n&1) printf("Meidikeji_Shijiediyi!\n");
            else printf("Yamato_Saikou!\n");
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值