F——取石子(博弈)

链接:https://www.nowcoder.net/acm/contest/75/F
来源:牛客网

取石子问题:http://blog.csdn.net/acmlzq/article/details/51212297

题目描述

共有N堆石子,已知每堆中石子的数量,两个人轮流取石子,每次只能选择N堆石子中的一堆取一定数量的石子(最少取一个),取过子之后,还可以将该堆石子中剩余的石子随意选取几个放到其它的任意一堆或几堆上。等哪个人无法取子时就表示此人输掉了游戏。注意:一堆石子没有子之后,就不能再往此处放石子了。

假设每次都是小牛先取石子,并且游戏双方都绝对聪明,现在给你石子的堆数、每堆石子的数量,请判断出小牛能否获胜。

输入描述:

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

输出描述:

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

输入

3
2 1 3
2
1 1
0

输出

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(全部移动到最后)

题意: 必败局面是有偶数堆石子, 并且每种石子数量的的堆数都为偶数, 然后就可以跟着对手取, 每次都把必败局面留给对手, 最后就会赢。每个非必败局都可以经过一次操作变为必败局。

 1 #include <stdio.h>  
 2 #include <math.h>  
 3 #include <string.h>  
 4   
 5 int data[101];  
 6   
 7 int main()  
 8 {  
 9     int n, i, temp, flag;  
10     while(scanf("%d", &n) && n)  
11     {  
12         flag = 0;  
13         memset(data, 0, sizeof(data));  
14         for(i = 0; i < n; i++)  
15         {  
16             scanf("%d", &temp);  
17             data[temp]++;  
18         }  
19         for(i = 0; i < 101; i++)  
20         {  
21             if(data[i] % 2 == 1)  
22             {  
23                 flag = 1;  
24                 break;  
25             }  
26         }  
27         if(flag)  
28         {  
29             printf("Win\n");  
30         }  
31         else  
32         {  
33             printf("Lose\n");  
34         }  
35     }  
36     return 0;  
37 }  

 



posted @ 2018-02-04 20:35  明楼  阅读(137)  评论(0)    收藏  举报