2018年全国多校算法寒假训练营练习比赛(第三场)---F---题(博弈)

本文介绍了一款基于博弈论的游戏,玩家需要通过移除和移动石子来取得胜利。文章详细解释了游戏规则及获胜条件,并提供了一段C语言代码实现,帮助读者理解如何判断初始状态下先手玩家是否能确保获胜。

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

题目链接---F-小牛再战

时间限制:C/C++ 1秒,其他语言2秒 
空间限制:C/C++ 32768K,其他语言65536K 
64bit IO Format: %lld 


题目描述 
共有N堆石子,已知每堆中石子的数量,两个人轮流取石子,每次只能选择N堆石子中的一堆取一定数量的石子(最少取一个),取过子之后,还可以将该堆石子中剩余的石子随意选取几个放到其它的任意一堆或几堆上。等哪个人无法取子时就表示此人输掉了游戏。注意:一堆石子没有子之后,就不能再往此处放石子了。 
假设每次都是小牛先取石子,并且游戏双方都绝对聪明,现在给你石子的堆数、每堆石子的数量,请判断出小牛能否获胜。 


输入描述: 
可能有多组测试数据(测试数据组数不超过1000) 
每组测试数据的第一行是一个整数,表示N(1<=N<=10) 
第二行是N个整数分别表示该堆石子中石子的数量。(每堆石子数目不超过100) 
当输入的N为0时,表示输入结束 


输出描述: 
对于每组测试数据,输出Win表示小牛可以获胜,输出Lose表示小牛必然会败。 


示例1 
输入


2 1 3 

1 1 

输出

Win 
Lose 
备注: 
提示: 
例如:如果最开始有4堆石子,石子个数分别为3 1 4 2,而小牛想决定要先拿走第三堆石子中的两个石子(石子堆状态变为3 1 2 2),然后他可以使石子堆达到的状态有以下几种: 
3 1 2 2(不再移动石子) 
4 1 1 2(移动到第一堆一个) 
3 2 1 2(移动到第二堆一个) 
3 1 1 3(移动到第四堆一个) 
5 1 0 2(全部移动到第一堆) 
3 3 0 2(全部移动到第二堆) 
3 1 0 4(全部移动到最后) 
解题思路: 
必败点是有偶数堆石子,并且每种石子数量的堆数都为偶数,必败点的推法不太清楚,这里不能详述。 根据博弈的PN图,每种必胜点都可以转化为必败点,所以只要存在有堆数为奇数的石子数量,就可以确定当前局面为必胜点。

代码实现如下:

#include<stdio.h>  
#define N 105  
int main()  
{  
    int n,a,i;  
    int num[N];  
    while(~scanf("%d",&n)&&n)  
    {  
        for(i=0;i<N;i++)  
            num[i]=0;  
        for(i=0;i<n;i++)  
        {  
            scanf("%d",&a);  
            num[a]++;  
        }  
        for(i=1;i<N;i++)  
        {  
            if(num[i]%2!=0)  
            {  
                printf("Win\n");  
                break;  
            }  
        }  
        if(i>=N)  
            printf("Lose\n");  
    }  
    return 0;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值