博弈之~取石子系列(二) nyoj 135

取石子(二)

時間限制: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

這種狀態下,無論對方怎麼取,小王都能獲勝。

解題思路

題意同上上取石子(六),不過限定了每堆石子最多可以取的石子數(最少爲一),問A是勝還是敗?(第一行是一個整數T表示測試數據的組數(T<100)每組測試數據的第一行是一個整數N(1<N<100),表示共有N堆石子,隨後的N行每行表示一堆石子,這N行中每行有兩個數整數m,n表示該堆石子共有m個石子,該堆石子每次最多取n(0<=m,n<=2^31)) 

代碼如下:

#include<stdio.h>
#include<string.h>
int	main(){
	int	nn;
	scanf("%d",&nn);
	while(nn--)
	{
		int	n,a,b,c=0;
		scanf("%d",&n);
		while(n--)
		{
			scanf("%d%d",&a,&b);
			a=a%(b+1);
			c^=a;
		}
		if(c)
		puts("Win");
		else
		puts("Lose");
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章