HDU5754(博弈)

意思是说四种棋子。问你随便一种棋子在一个n*m的格子上下棋是否能赢。

王:只能右、下和斜着走一格。他的必胜必败态可以找规律得到。

皇后:和王一样,但是能走任意步。

骑士:只能右、下,但是可以任意步。

马:走日。

分析:马的话,可能会出现平局,所以预处理出来每个点的必胜必败就好了。从1000*1000这个点往回跑。

王的话会发现当n和m都为奇数时先手赢不了。集体画3*3 5*5 4*4 画几个就明白了。

皇后的话无非就是两堆石子,可以分别取任意个,或者同时取相同。也可以预处理出sg函数。

骑士最简答。能一步走到头,。所以n==m时,无论你怎么走,对方都能和你走同样的步数在另一个方向。所以必败,反之你就可以走到必胜点,必胜。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dp[2010][2010];
int jump[1010][1010];
void sg()
{
    for(int i=1;i<=1000;i++)
        for(int j=1;j<=1000;j++)
            if(!dp[i][j])
                for(int k=1;k<=1000;k++)
                    dp[i+k][j+k]=dp[i+k][j]=dp[i][j+k]=1;
}
void init(){for(int i=1000;i>=3;i-=3)jump[i][i]=1,jump[i-1][i-2]=jump[i-2][i-1]=2;}
int main()
{
    sg();init();
    int t;scanf("%d",&t);
    while(t--)
    {
        int op,n,m;scanf("%d%d%d",&op,&n,&m);

        if(op==1){if(n&1&&m&1)printf("G\n");else printf("B\n");}
        else if(op==2){if(n==m)printf("G\n");else printf("B\n");}
        else if(op==3)
        {
            if(jump[n][m]==2)printf("B\n");
            else if(jump[n][m]==1)printf("G\n");
            else printf("D\n");
        }
        else
        {
            if(dp[n][m])printf("B\n");
            else printf("G\n");
        }
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值