现在的位置: 首页 > 综合 > 正文

uestc 第五届ACM趣味程序设计竞赛第二场(正式赛)棋盘

2014年02月18日 ⁄ 综合 ⁄ 共 1361字 ⁄ 字号 评论关闭

棋盘

Time Limit: 1000 ms Memory Limit: 65535 kB Solved: 124 Tried: 377

Submit

Status

Best Solution

Back

Description

UDKRU在一个白色的方格棋盘上玩游戏,棋盘有N行M列,由N*M个小方格组成。两人轮流进行游戏,UDK先开始,然后是RU。在每一轮游戏中,当前一方需要在棋盘上选择一个1*kk*1的全白矩形,并将里面的k个小格子全部染成黑色(每轮k的大小都可以由当前玩家自己决定),将最后一个格子染色的一方获得游戏胜利。

现在假设两人都采取最佳的策略,给定棋盘大小,请问谁将获得胜利?

Input

数据的第一行是一个整数T(0 <= T <= 10000),代表一共有T组测试数据。
接下来T行,每行由两个整数N和M组成(1 <= N, M <= 100),表示了每组数据中棋盘的大小。

Output

请严格输出T行,每行仅包括一个字符串"UDK" 或者 "RU",代表每组测试数据对应的胜利一方的姓名。

Sample Input

2
1 2
2 2

Sample Output

UDK
RU

Hint

Sample Input中共有两组数据,其中第一组数据棋盘的大小是1*2,即1行2列,UDK先手,可以直接选择涂1*2的矩阵,把棋盘完全染色从而直接获得胜利。
请严格按照输出规则输出,行末不允许有多余的空格,最后一组数据行末同样需要换行。

Source

第五届ACM趣味程序设计竞赛第二场(正式赛)

题解:博弈题,刚开始时,dp[i][j]表示i行j列时先手胜为1败为0,我就只能想到是如果dp[i-1][j]和的dp[i][j-1]有一个为0时

则dp[i][j]必定为1,因为先手可以走一步就可以达到先手必输的状态,让自己必赢。

但是如果相邻的两个状态都是1呢????

后来看了解题报告才知道自己方向想错了。。

当i和j都是偶数时先手必输,因为后手可以一直摆和先手对称的局面。那这样最后一定是后手赢了。。

当i和j都是奇数时先手必胜。因为先手可以摆一个在最中间。然后就一直跟着后手走。同上。最后先手赢。。

当i和j为奇偶时先手必赢。因为就像我刚开始想的一样。dp[i-1][j]和dp[i][j-1]必定有一个为0就是都是偶数先手必输。

。。。。。。。

最后总结一下:博弈论可以从上一步走一步就可以达到对方必输的局面。后者是跟着对方对称走。最后就会赢。。

#include<cstdio>
#include<cstring>
int dp[105][105];
char di[2][10] = {"RU","UDK"};
void Init()
{
	int i,j;
	for(i=1;i<101;i++)
	{
		dp[i][1] = 1;
		dp[1][i] = 1;
	}
	for(i=2;i<101;i++)
		for(j=2;j<101;j++)
		{
			if(dp[i-1][j]==0 || dp[i][j-1]==0)
			dp[i][j] = 1;
			else
			{
				if(i%2==0 && j%2==0)
					dp[i][j] = 0;
				else
					dp[i][j] = 1;
			}
		}
}
int main()
{
	int t,n,m;
	scanf("%d",&t);
	 Init();
	while(t--)
	{
		scanf("%d%d",&n,&m);
		printf("%s\n",di[dp[n][m]]);
	}
	return 0;
} 				    

抱歉!评论已关闭.