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

来源:互联网 发布:mac os 10.13 iso下载 编辑:程序博客网 时间:2024/06/05 05:43

题意:
给你一个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;}
0 0
原创粉丝点击