取石子(三)
时间限制:
1000 ms | 内存限制:
1000 KB
难度:
6
-
描述
-
小王喜欢与同事玩一些小游戏,今天他们选择了玩取石子。
游戏规则如下:共有N堆石子,已知每堆中石子的数量,两个人轮流取子,每次只能选择N堆石子中的一堆,取一定数量的石子(最少取一个),取过子之后,还可以将该堆石子中剩下的任意多个石子中随意选取几个放到其它的任意一堆或几堆上。等哪个人无法取子时就表示此人输掉了游戏。注意,一堆石子没有子之后,就不能再往此处放石子了。
假设每次都是小王先取石子,并且游戏双方都绝对聪明,现在给你石子的堆数、每堆石子的数量,请判断出小王能否获胜。
例如:如果最开始有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(全部移动到最后)
-
输入
-
可能有多组测试数据(测试数据组数不超过1000)
每组测试数据的第一行是一个整数,表示N(1<=N<=10)
第二行是N个整数分别表示该堆石子中石子的数量。(每堆石子数目不超过100)
当输入的N为0时,表示输入结束
输出
- 对于每组测试数据,输出Win表示小王可以获胜,输出Lose表示小王必然会败。 样例输入
-
3 2 1 3 2 1 1 0
样例输出
-
Win Lose
-
可能有多组测试数据(测试数据组数不超过1000)
这一题是楼教主男人八题翻译过来的,真心不会。 看别人博客才知道的规律。必败点是有偶数堆石子,并且每种石
子数量的堆数都为偶数。 必败点的推法不太清楚,这里不能详述。 根据博弈的PN图,每种必胜点都可以转化为必
败点,所以只要存在有堆数为奇数的石子数量,就可以确定当前局面为必胜点。
具体代码如下:
#include<cstdio>
#include<cstring>
int main()
{
int cnt[110],n,i,num,sign;
while(scanf("%d",&n)&&n)
{
memset(cnt,0,sizeof(cnt));
for(i=0;i<n;++i)
{
scanf("%d",&num);
cnt[num]++;
}
sign=0;
for(i=0;i<101;++i)
{
if(cnt[i]&1)
{
sign=1;
break;
}
}
if(sign)
printf("Win\n");
else
printf("Lose\n");
}
return 0;
}