ZJU1827

/*
单个game的游戏,可以使用sg函数计算,也可以使用必胜态,必败态推断。
这里我是计算sg值来算的。如果sg值是0则必败,否则必胜
*/

#include <cstdio>
#include <cstring>

int sg[5][5][5][5][5][5];
bool used[15000];
char in[25];
int n,A[7];

void init()
{
	memset(sg,-1,sizeof(sg));

	for(int i=0;i<=4;i++) for(int j=0;j<=4;j++) for(int k=0;k<=4;k++) 
	for(int x=0;x<=4;x++) for(int y=0;y<=4;y++) for(int z=0;z<=4;z++)
	{
		if( i*1+j*2+k*3+x*4+y*5+z*6==31 )
		{
			sg[i][j][k][x][y][z] = 0;
		}
		else if(  i*1+j*2+k*3+x*4+y*5+z*6>31 )
		{
			sg[i][j][k][x][y][z] = 1;
		}
	}

	for(int i=4;i>=0;i--) for(int j=4;j>=0;j--) for(int k=4;k>=0;k--)
	for(int x=4;x>=0;x--) for(int y=4;y>=0;y--) for(int z=4;z>=0;z--)
	{
		if( sg[i][j][k][x][y][z]!=-1 ) continue;
		memset(used,0,sizeof(used));
		if(i<4) used[ sg[i+1][j][k][x][y][z] ] = 1;
		if(j<4) used[ sg[i][j+1][k][x][y][z] ] = 1;
		if(k<4) used[ sg[i][j][k+1][x][y][z] ] = 1;
		if(x<4) used[ sg[i][j][k][x+1][y][z] ] = 1;
		if(y<4) used[ sg[i][j][k][x][y+1][z] ] = 1;
		if(z<4) used[ sg[i][j][k][x][y][z+1] ] = 1;
		for(int p=0;p<15000;p++)
		{
			if(!used[p])
			{
				sg[i][j][k][x][y][z] = p;
				break;
			}
		}
	}
}

int main()
{
	freopen("in.txt","r",stdin);
	freopen("out.txt","w",stdout);
	
	init();
	while(scanf("%s",in)==1)
	{
		n = strlen(in);
		memset(A,0,sizeof(A));
		for(int i=0;i<n;i++)
		{
			A[in[i]-'0']++;
		}
		printf("%s ",in);
		if(n&1)
		{
			// B
			if( sg[ A[1] ][ A[2] ][ A[3] ][ A[4] ][ A[5] ][ A[6] ] ) printf("B\n");
			else printf("A\n");
		}
		else
		{
			// A
			if( sg[ A[1] ][ A[2] ][ A[3] ][ A[4] ][ A[5] ][ A[6] ] ) printf("A\n");
			else printf("B\n");
		}
	}

	return 0;
}
posted @ 2011-06-14 14:29  AC2012  阅读(154)  评论(0编辑  收藏  举报