HDU 5754 Life Winner Bo 2016多校第三场1003

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5754

题意:给你一个n*m大小的棋盘,分别以国际象棋的国王、战车、骑士和皇后的走法从(1,1)走到(n,m),而且只能向右或者向下走,问谁有必胜的策略或者是两者平局。

题解:无论是哪一种移动,都可以注意到,如果从起点到某一个点有必胜的策略,那么再以必胜点作为起点可以走到下一个必胜点,也就是以小见大。

   一、对于王的走法,可以注意到3*3大小的棋盘,从(1,1)到(3,3)后手是有必胜的策略的,对于N和M更大的情况,我们把横坐标每隔3、纵坐标每隔3的点都画出来,这些点都是符合后手胜的。(因为无论先手怎么移动,后手都能重新移动到这些格子,直到到了终点)如果初始点不在这些点上,就必然是先手胜。因为先手可以立刻移动到上述的点。

   二、对于车的走法,注意到,如果目前的位置距离终点的x和y坐标差相等,一定是后手胜。(因为先手只能向下或者向右走一段路;无论他往哪里走,后手往另一维走相同的步数,依然保持这一样一种状态。)反之,先手必然能走到一处相等的位置,转化为上述问题,所以一定是先手胜。

   三、马的走法,在大多数情况下都是平局。在模3域下,某些地方会存在先后手赢。画图找规律。

   四、皇后的走法最为复杂,不过其实也就是一个威佐夫博弈。

   关于威佐夫博弈:http://baike.baidu.com/link?url=Xf_NMvP2GFcr93BAmCLsTqY6ULiseus-TLg0dgG_1yx1C-bzt0pSQAFOt0jMb6WvGwd9S_xIj6ZCtBIc0ygotbc9IglMjGcwHHD8nsohR-bIf5yNzG35AHD5xbhrhkSi)。

   我们可以将问题转化为:“有两堆石子,每次可以在一堆里取任意(非空)颗(相当于是车的走法),或者在两堆里取相同(非空)颗(相当于是象的走法),取到最后一颗石子的人获胜,问先后手谁有必胜策略。”为什么说是威佐夫博弈呢。

   其实仔细想一想就会明白这个走法产生的局面(画图更为清楚),先手从(1,1)开始走,那么第一步他可以到达任意一个x=1(或y=1,两者对称)的局面,那么我们看x=2的时候,(2,1)(2,2)是先手在第一步能到达的。然而(2,3)是后手的必胜点。那么根据前面所说我们在从(2,3)作为起点开始推可以知道,从(2,3)开始的第一步是可以到达坐标中带有2或者3的任意点(别忘了(3,2)与(2,3)等价),也就是说后手的下一个必胜点必定是从x=4(或y=4)开始的(而且x=4时必定有后手的必胜点),这里又是为什么呢?很简单,就是因为从(2,3)开始走,所有坐标中带有2或者3的所有局面先手都可以到达,而且先手只能去到坐标中带有4的部分局面。如图(把所有坐标+1即可得到本题局面):

    由此我们可以推知,皇后的走法,后手必胜点就是威佐夫博弈中的奇异局势,打表即可(也有必胜点的公式求法:一个奇异局势(ak,bk)为:ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...n 方括号表示取整函数)

    这是本人对威佐夫博弈的一点点理解,还不够深入,欢迎吐槽!。

代码如下:

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <cmath>
 7 using namespace std;
 8
 9 const double phi=(1+sqrt(5.0))/2.0;
10 int t,ty;
11 int n,m;
12 int g[1005][1005];
13 int f[1005];
14 int vis[2][2005];
15
16 int main()
17 {
18     int x,y;
19     for(int i=1;;i++)
20     {
21         x=phi*i;
22         y=x+i;
23         if(y>1000)
24             break;
25         f[x]=y;
26     }
27     scanf("%d",&t);
28     while(t--)
29     {
30         scanf("%d%d%d",&ty,&n,&m);
31         if(ty==1)
32         {
33             if(n%2&&m%2)
34                 puts("G");
35             else
36                 puts("B");
37             continue;
38         }
39         else if(ty==2)
40         {
41             if(n==m)
42                 puts("G");
43             else
44                 puts("B");
45             continue;
46         }
47         else if(ty==3)
48         {
49             if(n==m&&n%3==1)
50                 puts("G");
51             else if(max(n,m)%3==0&&max(n,m)-min(n,m)==1)
52                 puts("B");
53             else
54                 puts("D");
55         }
56         else
57         {
58             n--,m--;
59             if(n>m) swap(n,m);
60             if(f[n]==m)
61                 puts("G");
62             else
63                 puts("B");
64         }
65     }
66     return 0;
67 } 
时间: 2024-10-08 15:00:17

HDU 5754 Life Winner Bo 2016多校第三场1003的相关文章

HDU 5794 A Simple Nim 2016多校第六场1003

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5795 题意:给你n堆石子,每一堆有ai石头,每次有两种操作,第一种在任意一堆取出任意数量的石头但不能为0,第二种把一堆石头分成三堆任意数量的石头(不能为0),问是先手赢还是后手赢. 题解:这就是一个Nim游戏!那么Nim游戏一般跟SG函数有关,所以这道题打表找规律即可. 关于SG函数,在这里也说一下吧!毕竟第一次接触. Nim游戏与SG函数:http://baike.baidu.com/link?u

HDU 5754 Life Winner Bo 组合博弈

Life Winner Bo Problem Description Bo is a "Life Winner".He likes playing chessboard games with his girlfriend G. The size of the chessboard is N×M.The top left corner is numbered(1,1) and the lower right corner is numberd (N,M). For each game,B

【博弈论】HDU 5754 Life Winner Bo

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5754 题目大意: 4种棋子,象棋中的 1王,2车,3马,4后,选其一,B和G轮流走,不能往左上走,一开始棋子在(1,1),谁先走到(n,m)谁赢,无法走动算平局D. (n,m<=1000,case<=1000) 题目思路: [博弈论] 这题博弈论.怎样都输为必败,只能走到必败的为必胜. 王:(王可以横竖斜走一格)如果n个m均为奇数先手必败,否则必胜. 从3x3格子看,当n和m均为奇数时先手必败,

HDU 4923 Room and Moor (多校第六场C题) 单调栈

Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0 or 1. In order to beat him, programmer Moor has to construct another sequence B = {B1, B2,... , BN} of the same length, which satisfies that: Input The inp

2014多校第三场1005 || HDU 4891 The Great Pan(模拟)

题目链接 题意 : 给你n行字符串,问你有多少种理解方式.有两大类的理解 (1){A|B|C|D|...}代表着理解方式可以是A,可以是B或C或者D. (2)$blah blah$,在$$这两个符号中间,如果是不连续的空格的那个位置就有2种理解方式,可以理解为没有空格也可以理解为有空格.如果有连续N个空格的位置,那里就有N+1种理解方式. 最后所有的理解方式相乘,数据保证$一定与$匹配,{一定与匹配},不会有任何嵌套,类似{$$}或者{{}}或者${}$这种情况都不会出现,也不会有{$}这种情况

【HDU】4923 Room and Moor(2014多校第六场1003)

Room and Moor Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 263    Accepted Submission(s): 73 Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0

2014多校第七场1003 || HDU 4937 Lucky Number

题目链接 题意 : 给定一个十进制n,让你转化成某个进制的数,让这个数只包含3 4 5 6这些数字,这个进制就成为n的幸运数字,输出有多少幸运数字,例如19,5进制表示是34,所以5是19的一个幸运数. 思路 : 以下思路有这里提供 先考虑特殊情况,所情况下会有无穷个?只有n=3,4,5,6的时候,因为这几个数在大于n的进制下都是他本身..注意特殊情况不包括33,343这些(我一开始就死在这里了,wa了三次).因为33在34进制下就不是33了(类似于10在16进制下就是A了). 我们知道n=a0

hdu 4865 Peter&#39;s Hobby(2014 多校联合第一场 E)

题意:已知昨天天气与今天天气状况的概率关系(wePro),和今天天气状态和叶子湿度的概率关系(lePro)第一天为sunny 概率为 0.63,cloudy 概率 0.17,rainny 概率 0.2.给定n天的叶子湿度状态,求这n天最可能的天气情况 分析:概率dp设 dp[i][j] 表示第i天天气为j的最大概率,pre[i][j]表示第i天天气最可能为j的前一天天气,dp[i][j]=max(dp[i-1][k]+log(wePro[k][j])+log(lePro[j][lePos[i]]

2018 HDU多校第三场赛后补题

2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube 题意: 在画布上画一个三维立方体. 题解: 模拟即可. 代码: #include <bits/stdc++.h> using namespace std; int a, b, c, R, C; char g[505][505]; int main () { int T; cin >>