nyoj 135 取石子 NIM

Posted gcczhongduan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nyoj 135 取石子 NIM相关的知识,希望对你有一定的参考价值。

取石子(二)

时间限制:3000 ms  |  内存限制:65535 KB
难度:5
描写叙述

小王喜欢与同事玩一些小游戏。今天他们选择了玩取石子。

游戏规则例如以下:共同拥有N堆石子。已知每堆中石子的数量。而且规定好每堆石子最多能够取的石子数(最少取1颗)。

两个人轮流取子。每次仅仅能选择N堆石子中的一堆,取一定数量的石子(最少取一个),而且取的石子数量不能多于该堆石子规定好的最多取子数。等哪个人无法取子时就表示此人输掉了游戏。

如果每次都是小王先取石子,而且游戏两方都绝对聪明,如今给你石子的堆数、每堆石子的数量和每堆石子规定的单次取子上限,请推断出小王是否能获胜。

输入
第一行是一个整数T表示測试数据的组数(T<100)
每组測试数据的第一行是一个整数N(1<N<100),表示共同拥有N堆石子,随后的N行每行表示一堆石子。这N行中每行有两个数整数m,n表示该堆石子共同拥有m个石子,该堆石子每次最多取n个。(0<=m,n<=2^31)
输出
对于每组測试数据,输出Win表示小王能够获胜,输出Lose表示小王必定会败。
例子输入
2
1
1000 1
2
1 1
1 1
例子输出
Lose
Lose
提示
注意以下一组測试数据
2
1 1 
2 2
正确的结果应该是Win
由于小王会先从第二堆石子中取一个石子,使状态变为
1 1
1 2
这样的状态下,不管对方怎么取,小王都能获胜。

nim博弈+巴什

代码:

/*
nim
*/
#include <stdio.h>
int main(){
	int t, n;
	scanf("%d", &t);
	while(t --){
 	scanf("%d", &n);
 	int ans = 0,a, k;
 	while(n --){
	 	scanf("%d%d", &a, &k);
	 	a%=(k+1);
	 	ans^=a;
	 }
	 printf("%s\n", ans?

"Win":"Lose"); } return 0; }



以上是关于nyoj 135 取石子 NIM的主要内容,如果未能解决你的问题,请参考以下文章

NYOJ-取石子

BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏 [Nim游戏 SG函数]

nyoj 23-取石子(博弈)

模板nim游戏

P2197 nim游戏

浅析Nim游戏和ICG博弈