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

来源:互联网 发布:ubuntu不能切换中英文 编辑:程序博客网 时间:2024/05/31 18:51

棋盘

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;elsedp[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;}     


2 0