• HDU 5754 Life Winner Bo (各种博弈) 2016杭电多校联合第三场


    题目传送门

    题意:一个国际象棋棋盘,有四种棋子,从(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 <cmath>
    #include <algorithm>
    using namespace std;
    int t,a,b,c;
    void pra()
    {
        puts("B");
    }
    void prb()
    {
        puts("G");
    }
    void prc()
    {
        puts("D");
    }
    void solve1()
    {
        if((a&1)&&(b&1))
        prb();
        else
        pra();
    }
    void solve2()
    {
        if((a^b)!=0) pra();
        else prb();
    }
    void solve3()
    {
        a--;
        b--;
        if((a+b)%3!=0)
        prc();
        else
        {
            if(a<b) swap(a,b);
            if(a==b) prb();
            else if((a-b)==1) pra(); //()
            else prc();
        }
    }
    void solve4()
    {
        a--;
        b--;
        if(a>b)
        swap(a,b);
        c=b-a;
        if(a==int((sqrt(5)+1)/2*c))
        prb();
        else
        pra();
    }
    int main()
    {
        cin>>t;
        while(t--)
        {
            cin>>c>>a>>b;
            if(c==1) solve1();
            else if(c==2) solve2();
            else if(c==3) solve3();
            else if(c==4) solve4();
        }
        return 0;
    }
  • 相关阅读:
    vsprintf函数和va_list用法详解
    copy_from_user 详解
    OK6410之蜂鸣器buzzer字符驱
    树莓派调试PCF8591遇到的小问题
    APM关键姿态控制源码讲解
    APM姿态控制流程
    没有安装gawk
    git 第一次上传本地代码到远程仓库,解决 ! [rejected] master -> master (non-fast-forward)错误
    C++ 全面刨析使用指针方法 _new _delete
    typedef&define的用法与区别
  • 原文地址:https://www.cnblogs.com/Ritchie/p/5708601.html
Copyright © 2020-2023  润新知