hdu5754 Life Winner Bo 各种博弈(多校)

题意:
给你一个n∗m的棋盘,然后给你4种棋子,分别是:
1.王:能横着走,或者竖着走,或者斜着走,每次可以走1格
2.车:可以横着走或者竖着走,每次可以走无数格
3.马:走日字形,例如:如果现在在(1,1),可以走到(2,3),即先走一格直线,然后斜着走一格
4.王后:可以横着走,或者竖着走,或者斜着走,每次可以走无数格
所有棋子在走的时候只能向右或向下走,不可后退,谁先走到(n,m)点,谁赢.
分析:
1.王:从必败点递推,就能发现规律了。
2.车:nim博弈,横着走n-1步,竖着走m-1步,相当于从两堆n-1和m-1的石子中取石子。
3.马:这个是画图,找规律,要注意一个玩家发现自己会输并且不是必败点的话他可以选则平局,这题要从(1,1)点往后推必败点和必胜点。具体的推导的话可以参考这篇博客:http://blog.csdn.net/helloiamclh/article/details/52039236
4.王后:威佐夫博弈

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int T;scanf("%d",&T);
    int t,n,m;
    while(T--){
        scanf("%d%d%d",&t,&n,&m);
        if(t==1){
            if(n%2==0||m%2==0)puts("B");
            else puts("G");
        }
        else if(t==2){
            if((n^m)==0)puts("G");
            else puts("B");
        }
        else if(t==3){
            if(n==m&&n%3==1)puts("G");
            else if(m==n-1&&n%3==0)puts("B");
            else if(n==m-1&&m%3==0)puts("B");
            else puts("D");
        }
        else if(t==4){
            n--;m--;
            int k=abs(n-m);
            int minn=min(n,m);
            int ak=floor(k*(1.0+sqrt(5.0))/2);
            if(ak==minn)puts("G");
            else puts("B");
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/01world/p/5762826.html