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;
}