CF920 Eat the Chip (枚举算法)

文章讲述了在一种特殊的棋盘游戏中,白棋和黑棋遵循特定的移动规则,分析了行数差距对先手和后手胜率的影响,提供了基于列数差的计算方法来决定比赛结果。给出C++代码示例来解决这一问题。
摘要由CSDN通过智能技术生成

Problem - E - Codeforces传送门

题目大意:棋盘上白棋子Alice先手,黑棋子Bob后手。白棋子只能向下三个位置,黑棋子只能向上三个位置,谁先走到对方棋子位置就获胜。两个棋子起点一定不相同。

分析:显然问题是有规律性的,如果白棋子在下而黑棋子在上,那么一定平局。

继续分析如果两个棋子行数差距为奇数先手赢,偶数后手赢。

以奇数行差距为例,后手玩家为避免被吃掉,走棋时一定要尽可能远离白棋,

情况1:如果起始两个棋子列数差为1或者0,那么白棋先走可以始终保持在黑棋正上方,黑棋必败。

情况2:列数差大于等于2,此时黑棋走棋趋势为加大这个列数差,白棋一定减少这个列数差。如果棋盘无限大,那么必然平局。但是棋盘不是无限大,黑棋每逃离一次,白棋追赶一次,两个棋子行数差会减少2.以此为判定条件,问题可解。

ps:需要注意初始时两个棋子列数差也要考虑进去。为方便阅读,代码没有进行公式化简

#include <iostream>
using namespace std;
int main()
{
    int t,n,m,a,b,c,d;
    cin>>t;
    while(t--)
    {
        cin>>n>>m>>a>>b>>c>>d;
        if(a>=c)
            cout<<"Draw\n";
        else if((c-a)%2==0 ) /**< 后手赢 */
        {  /**< (b-d)-1+m-b,前面(b-d)-1为原始差距,后面m-b是逃离最大距离,两部分的和大于行差除2,可以逃离 */
            if(b-d>=1&&(b-d)-1+m-b>=(c-a)/2||d-b>=1&&d-b-1+b-1>=(c-a)/2)
               cout<<"Draw\n";
            else
                cout<<"Bob\n";
        }
        else
        {
            if(d-b>=2&&d-b-2+m-d>=(c-a)/2||b-d>=2&&b-d-2+d-1>=(c-a)/2)
                cout<<"Draw\n";
            else
                cout<<"Alice\n";
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值