1. 程式人生 > >1072 威佐夫遊戲(威佐夫博弈模板)

1072 威佐夫遊戲(威佐夫博弈模板)

/*
Wythoff Game:黃金分割
先取完者贏
威佐夫博弈:每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取
一個局面,讓你求是先手輸贏:差值 * 1.618 == 最小值的話後手贏,否則先手贏
一個局面,讓你求先手輸贏,假設先手贏的話輸出他第一次的取法:
首先討論在兩邊同時取的情況,很明顯兩邊同時取的話,不論怎樣取他的差值是不會變的,那麼我們可以根據差值計算出其中的小的值,然後加上差值就是大的一個值,當然能取的條件是求出的最小的值不能大於其中小的一堆的石子數目。
加入在一堆中取的話,可以取任意一堆,那麼其差值也是不定的,但是我們可以列舉差值,差值範圍是0----大的石子數目,然後根據上面的理論判斷滿足條件的話就是一種合理的取法。
*/
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double g=(sqrt(5)+1)/2;
int main(){
	int n,a,b;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d%d",&a,&b);
		if(a>b) swap(a,b);
		int t=(b-a)*g;
		if(t==a) puts("B");
		else puts("A");
	}
	return 0;
}

基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題  收藏  關注 有2堆石子。A B兩個人輪流拿,A先拿。每次可以從一堆中取任意個或從2堆中取相同數量的石子,但不可不取。拿到最後1顆石子的人獲勝。假設A B都非常聰明,拿石子的過程中不會出現失誤。給出2堆石子的數量,問最後誰能贏得比賽。 例如:2堆石子分別為3顆和5顆。那麼不論A怎樣拿,B都有對應的方法拿到最後1顆。 Input
第1行:一個數T,表示後面用作輸入測試的數的數量。(1 <= T <= 10000)
第2 - T + 1行:每行2個數分別是2堆石子的數量,中間用空格分隔。(1 <= N <= 2000000)
Output
共T行,如果A獲勝輸出A,如果B獲勝輸出B。
Input示例
3
3 5
3 4
1 9
Output示例
B
A
A