hdu_5754_Life Winner Bo(博弈)

时间:2021-02-24 15:04:48

题目链接:hdu_5754_Life Winner Bo

题意:

一个棋盘,有国王,车,马,皇后四种棋子,bo先手,都最优策略,问你赢的人,如果双方都不能赢就输出D

题解:

全部都可以直接推公式, 这里我推出前两种比较简单的,后面的模拟打个表就行了

 #include<bits/stdc++.h>
#define mst(a,b) memset(a,b,sizeof(a))
#define F(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
typedef long long ll; int mp3[][],mp4[][],lie[],hang[],xie[];
void init()
{
for(int i=;i>=;i-=)
{
mp3[i][i]=;
if(i->=&&i->=)mp3[i-][i-]=;
if(i->=&&i->=)mp3[i-][i-]=;
}
for(int i=;i>=;i--)
{
if(hang[i])continue;
for(int j=;j>=;j--)
{
if(lie[j]||xie[+i-j])continue;
mp4[i][j]=;
hang[i]=,lie[j]=,xie[+i-j]=;
break;
}
}
} int main(){
init();
int t,type,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&type,&n,&m);
int nn=-n+,mm=-m+;
if(type==)
{
if(n&&&m&)puts("G");else puts("B");
}
else if(type==)
{
if(n==m)puts("G");else puts("B");
}
else if(type==)
{
if(mp3[nn][mm]==)puts("G");
else if(mp3[nn][mm]==)puts("B");
else puts("D");
}
else if(mp4[nn][mm])puts("G");else puts("B");
}
return ;
}