各种博弈-HDU5754

https://vj.xtuacm.cf/contest/view.action?cid=146#problem/B

题意:一个国际象棋棋盘,有四种棋子,从(n,m)走到(1,1),走到(1,1)的人赢,先手赢输出B,后手赢输出G,平局输出D。

题解:先把从(n,m)走到(1,1)看做是从(1,1)走到(n,m)。

四种棋子的规则如下:

1、王(King):横、竖、斜都可以走,每次限走一格

2、车(Rook):横、竖均可走,不能斜走,格数不受限制,除王车易位的情况下,平时不能越子

3、马(Knight):每步棋先横走或竖走一格,再斜走一格(或者横两格竖一格,竖两格横一格),可以越子

4、后(Queen):横、竖、斜都可以走,格数不受限制,但不能越子

第一种很明显(1,1)是必败点,可以走到必败点的都是必胜点,而只能走到必胜点的都是必败点,所以很容易得出结论:n,m都为奇数则先手必败。

第二种把这个问题看做是两堆石子,取石子问题,是尼姆博弈,异或为0即相等的时候先手必败。

第三种先n–,m–,把问题转化为(0,0)是终点,如果n+m不是3的倍数一定是平局;如果是3的倍数,如果nm相等,那么一定是必败的,先手减2减1,后手就减1减2,必败;如果nm不等且n=m+1或者m=n+1,那么先手必胜,因为可以一步走到必败点,必胜;其余情况都是平局,因为如果一方存在赢的情况,另一方可以不走那步,把小的数-2,大的数-1,往墙上靠,谁也赢不了肯定是平局。

注意:n和m相差1不能用异或=1判断,如果奇数-偶数=1异或确实为1,偶数-奇数=1就不是了,受到以前一道概率DP题的误导结果WA了好多次,那个题是if((j>>(i-1)^1)==(k>>(i-1))) 是足球淘汰赛,01,23,45一组,和这个题不一样,要注意。附上那道题:传送门。

第四种也是看做两堆石子,取石子问题,是威佐夫博弈。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int t,m,n;
        scanf("%d%d%d",&t,&m,&n);
        if(t==1)
        {
            if((n&1)&&(m&1))printf("G\n");
            else printf("B\n");
        }
        else if(t==2)
        {
            if(m^n)printf("B\n");
            else printf("G\n");
        }
        else if(t==3)   
        {
            m--;
            n--;
            if((m+n)%3)printf("D\n");
            else{
                if(m<n)swap(m,n);
                if(m==n)printf("G\n");
                else if((m-n)==1)printf("B\n");
                else printf("D\n");
            }
        }
        else
        {
            m--;
            n--;
            if(m<n)swap(m,n);
            int c=m-n;
            if(n==(int)((sqrt(5)+1)/2*c))
                printf("G\n");
            else printf("B\n");
        }
    }
    return 0;
}

官方题解:我们依次分析每一种棋子。

①王。

首先注意一个3*3的棋盘,开始在(1,1),问走到(3,3)谁有必胜策略。

穷举所有情况,容易发现这是后手赢。

对于NN和MM更大的情况,我们把横坐标每隔3、纵坐标每隔3的点都画出来,这些点都是符合后手胜的。
(因为无论先手怎么移动,后手都能重新移动到这些格子,直到到了终点)

如果初始点不在这些点上,就必然是先手胜。因为先手可以立刻移动到上述的点。

②车。

注意到,如果目前的位置距离终点的xx和yy坐标差相等,一定是后手胜。
(因为先手只能向下或者向右走一段路;无论他往哪里走,后手往另一维走相同的步数,依然保持这一样一种状态。)

反之,先手必然能走到一处相等的位置,转化为上述问题,所以一定是先手胜。

③马。

同样还是画图可以得到规律。

在大多数情况下都是平局。在模3域下,某些地方会存在先后手赢。

④皇后。

画画图后,我们可以将问题转化为:

“有两堆石子,每次可以在一堆里取任意(非空)颗(相当于是车的走法),或者在两堆里取相同(非空)颗(相当于是象的走法),取到最后一颗石子的人获胜,问先后手谁有必胜策略。”

此题中N\leq 1000N≤1000,可以直接用DP的方法解决。
设f[x][y]为横坐标距离终点x步,纵坐标距离终点y步时,必胜的是先手还是后手。

直接转移的话,可以枚举先手的下一步决策进行转移,这样是O(N^3)O(N
​3
​​ )的。

注意到转移只是一行、一列或者斜着一列,这些都可以通过前缀和,做到最终O(N^2)O(N
​2
​​ )。

其实对于更大的NN也是可以做的。

由于叙述起来比较麻烦,具体的结论和证明可以参见:

https://en.wikipedia.org/wiki/Wythoff/%27s_game

当时做是直接画图,在纸上列举出各种情况,坐标可以表示出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值