FAFU1010 anti-nim

Description:
      John和他的哥哥一起玩一個遊戲,有N種顏色不一樣的球,編號爲1-N,每種球有a[i]個,其中a[i]對應第i個球的數量。 
      遊戲很簡單,首先給定初始的N種球的數量,由John開始遊戲,可以在任意一種顏色的球取出任意個,每一輪至少取一個球。 
      如果誰先把球取完,那麼誰就是輸家。另一人是贏家。 
      
Input:
輸入數據第一行爲T,表示要測試數據的組數;0< T<= 50 第二行爲N,表示有幾種顏色的球;(0< N<= 50) 第三行爲N個數,表示每種顏色的球的個數a[i],(0< a[i]<= 5000)
Output:
對應每組數據輸出最後的贏家,如果John贏則輸出John,否則輸出Brother
Sample Input:
233 5 111
Sample Output:
JohnBrother
先手必勝當且僅當: (1)所有堆的石子數都爲1且遊戲的SG值爲0; (2)有些堆的石子數大於1且遊戲的SG值不爲0
#include "stdio.h"
#include "string.h"
int a[1001];
int sg[1111];

void getsg()//打表程序 
{
	int i,j,k;
	memset(sg,0,sizeof(sg));
	for(i=1;i<=100;i++)
	{
		memset(a,0,sizeof(a));
		for(j=0;j<=i;j++)
		{
			a[sg[i-j]]=1;
		}
		for(j=0;;j++)
		{
			if(a[j]==0)
			{
				sg[i]=j;
				break;
			}
		}
	}
}

int main()
{
	int i;
//	getsg();

//	for(i=0;i<1000;i++)

//	{

//		printf("%d ",sg[i]);

//	}

	int kk,n,k,j,flag;
	scanf("%d",&kk); 
	while (kk--)
	{
		int a,b=0;
		flag=0;
		scanf("%d",&n);
		for(i=0;i<n;i++)
		{
			scanf("%d",&a);
			b=b^a;
			if(a>1)
				flag=1;
			
		}
		if(flag==0)
		{
			if(b==0)
				printf("John\n");
			else 
				printf("Brother\n");
		}
		else 
		{
			if(b)
				printf("John\n");
			else 
				printf("Brother\n")	;
		}
	}
	
	return 0;
}


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