Codeforces Round 920 (Div. 3) E. Eat the Chip 题解 博弈论 贪心

Eat the Chip

题目描述

Alice and Bob are playing a game on a checkered board. The board has h h h rows, numbered from top to bottom, and w w w columns, numbered from left to right. Both players have a chip each. Initially, Alice’s chip is located at the cell with coordinates ( x a , y a ) (x_a, y_a) (xa,ya) (row x a x_a xa, column y a y_a ya), and Bob’s chip is located at ( x b , y b ) (x_b, y_b) (xb,yb). It is guaranteed that the initial positions of the chips do not coincide. Players take turns making moves, with Alice starting.

On her turn, Alice can move her chip one cell down or one cell down-right or down-left (diagonally). Bob, on the other hand, moves his chip one cell up, up-right, or up-left. It is not allowed to make moves that go beyond the board boundaries.

More formally, if at the beginning of Alice’s turn she is in the cell with coordinates ( x a , y a ) (x_a, y_a) (xa,ya), then she can move her chip to one of the cells ( x a + 1 , y a ) (x_a + 1, y_a) (xa+1,ya), ( x a + 1 , y a − 1 ) (x_a + 1, y_a - 1) (xa+1,ya1), or ( x a + 1 , y a + 1 ) (x_a + 1, y_a + 1) (xa+1,ya+1). Bob, on his turn, from the cell ( x b , y b ) (x_b, y_b) (xb,yb) can move to ( x b − 1 , y b ) (x_b - 1, y_b) (xb1,yb), ( x b − 1 , y b − 1 ) (x_b - 1, y_b - 1) (xb1,yb1), or ( x b − 1 , y b + 1 ) (x_b - 1, y_b + 1) (xb1,yb+1). The new chip coordinates ( x ′ , y ′ ) (x', y') (x,y) must satisfy the conditions 1 ≤ x ′ ≤ h 1 \le x' \le h 1xh and 1 ≤ y ′ ≤ w 1 \le y' \le w 1yw.


Example game state. Alice plays with the white chip, Bob with the black one. Arrows indicate possible moves.

A player immediately wins if they place their chip in a cell occupied by the other player’s chip. If either player cannot make a move (Alice—if she is in the last row, i.e. x a = h x_a = h xa=h, Bob—if he is in the first row, i.e. x b = 1 x_b = 1 xb=1), the game immediately ends in a draw.

What will be the outcome of the game if both opponents play optimally?

输入描述

Each test consists of multiple test cases. The first line contains a single integer t t t ( 1 ≤ t ≤ 1 0 4 1 \le t \le 10^4 1t104) — the number of test cases. This is followed by the description of the test cases.

Each test case consists of a single line containing six integers h h h, w w w, x a x_a xa, y a y_a ya, x b x_b xb, y b y_b yb ( 1 ≤ x a , x b ≤ h ≤ 1 0 6 1 \le x_a, x_b \le h \le 10^6 1xa,xbh106, 1 ≤ y a , y b ≤ w ≤ 1 0 9 1 \le y_a, y_b \le w \le 10^9 1ya,ybw109) — the dimensions of the board and the initial positions of Alice’s and Bob’s chips. It is guaranteed that either x a ≠ x b x_a \ne x_b xa=xb or y a ≠ y b y_a \ne y_b ya=yb.

It is guaranteed that the sum of h h h over all test cases does not exceed 1 0 6 10^6 106.

输出描述

For each test case, output “Alice” if Alice wins, “Bob” if Bob wins, and “Draw” if neither player can secure a victory. You can output each letter in any case (lowercase or uppercase). For example, the strings “bOb”, “bob”, “Bob”, and “BOB” will be accepted as Bob’s victory.

样例 #1

样例输入 #1

12
6 5 2 2 5 3
4 1 2 1 4 1
1 4 1 3 1 1
5 5 1 4 5 2
4 4 1 1 4 4
10 10 1 6 10 8
10 10 2 6 10 7
10 10 9 1 8 1
10 10 8 1 10 2
10 10 1 1 2 1
10 10 1 3 4 1
10 10 3 1 1 1

样例输出 #1

Alice
Bob
Draw
Draw
Draw
Alice
Draw
Draw
Bob
Alice
Alice
Draw

思路

他逃,他追,他插翅难飞。 题意转化一下就是考虑是否有一方可以追杀另一方(白棋走到黑棋位置或者黑棋走到白棋位置)。两个棋子的下法有显而易见的特点:白棋只会往下走,黑棋只会往上走,且在一个回合后,白棋与黑棋的行间距一定发生了 +2 或 -2 的变化。所以,对于初始行间距确定的白黑棋,二者谁追杀谁是确定的:如果初始行间距为奇数,那么只可能是白棋走到黑棋的位置上,白棋追杀黑棋,即Alice追杀Bob;如果初始行间距为偶数,那么只可能是黑棋走到白棋的位置上,黑棋追杀白棋,即Bob追杀Alice。对于逃跑,根据贪心策略,逃亡者朝着水平上追杀者的反方向逃跑,才最有可能逃跑成功(即造成平局)。所以问题转化为了在追杀情况下,供逃亡者逃跑的水平方向上的剩余列数是否足够。如果足够,平局;不足够,追杀者获胜。而在非追杀情况下(即 x a > = x b x_a>=x_b xa>=xb 时),一定为平局。

代码

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
typedef long long ll;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int t;
    cin >> t;
    while (t--)
    {
        int h, w, xa, ya, xb, yb;
        cin >> h >> w >> xa >> ya >> xb >> yb;
        // 由于Alice的棋子只会往下走,Bob的棋子只会往上走,那么如果xa>=xb,则二者不可能走到同一点,必为平局
        if (xa >= xb)
        {
            cout << "Draw\n";
        }
        else
        {
            // 分两种情况:Alice追杀Bob,Bob追杀Alice
            if (!((xb - xa) & 1)) // 行间距为偶数时,Bob追杀Alice
            {
                if (ya == yb) // 不论逃亡者下棋,追杀者永远可以走到与逃亡者同一列上
                    cout << "Bob\n";
                else
                {
                    int cnt = (xb - xa) / 2; // cnt表示至少需要多少的列数供逃亡者逃亡
                    if (ya > yb)
                    {
                        cnt -= ya - yb - 1;
                        if (cnt <= w - ya) // 逃亡方向剩余列数足够,则平局
                            cout << "Draw\n";
                        else
                            cout << "Bob\n";
                    }
                    else
                    {
                        cnt -= yb - ya - 1;
                        if (cnt <= ya - 1) // 逃亡方向剩余列数足够,则平局
                            cout << "Draw\n";
                        else
                            cout << "Bob\n";
                    }
                }
            }
            else // 行间距为奇数时,Alice追杀Bob
            {
                // 由于Alice先手,可以通过先下一步棋使得ya靠近yb的方式将问题转化为逃亡者先手
                if (ya > yb)
                    ya--;
                if (ya < yb)
                    ya++;
                if (ya == yb) // 不论逃亡者下棋,追杀者永远可以走到与逃亡者同一列上
                    cout << "Alice\n";
                else
                {
                    int cnt = (xb - xa) / 2; // cnt表示至少需要多少的列数供逃亡者逃亡
                    if (ya > yb)
                    {
                        cnt -= ya - yb - 1;
                        if (cnt <= yb - 1) // 逃亡方向剩余列数足够,则平局
                            cout << "Draw\n";
                        else
                            cout << "Alice\n";
                    }
                    else
                    {
                        cnt -= yb - ya - 1;
                        if (cnt <= w - yb) // 逃亡方向剩余列数足够,则平局
                            cout << "Draw\n";
                        else
                            cout << "Alice\n";
                    }
                }
            }
        }
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/676516.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

回溯--字母迷宫

1.题目描述 字母迷宫游戏初始界面记作 m x n 二维字符串数组 grid&#xff0c;请判断玩家是否能在 grid 中找到目标单词 target。 注意&#xff1a;寻找单词时 必须 按照字母顺序&#xff0c;通过水平或垂直方向相邻的单元格内的字母构成&#xff0c;同时&#xff0c;同一个单…

SSM民宿在线预订平台的设计与实现-计算机毕业设计源码44449

摘 要 信息化社会内需要与之径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对民宿在线预订平台等问题&#xff0c;对民宿信息管理进行研究分…

【Qt知识】Qt窗口坐标系

Qt的窗口坐标体系遵循标准的计算机图形坐标系统规则 Qt窗口坐标体系特点 坐标原点&#xff1a;窗口坐标体系的原点位于窗口的左上角&#xff0c;即坐标(0, 0)位置。 轴方向&#xff1a; X轴&#xff1a;向右为正方向&#xff0c;随着X坐标值的增加&#xff0c;元素在窗口中从…

Honor of Kings 2024.06.03 50star (S35) AFK

Honor of Kings 2024.06.03 50star (S35) AFK 来个赛季S35总结吧&#xff0c;这个赛季结束以后&#xff0c;可能要和【魔兽世界】一样AFK了&#xff0c;手游来说肯定没法子和WOW相比&#xff0c;干啥都是有队友才好玩。 我玩的基本都是肉&#xff0c;爆发强的英雄&#xff0c;最…

重学java 57.哈希表结构存储过程

别焦虑&#xff0c;生活无非见招拆招 —— 24.6.3 哈希表存储数据去重复的过程: a.先比较元素的哈希值(重写hashCode),再比较内容(重写equals) b.如果哈希值不一样,证明内容不一样,存 c.如果哈希值一样,再比较内容 如果哈希值一样,内容不一样(哈希碰撞,哈希冲突),存 如果哈希值…

FASTGPT:可视化开发、运营和使用的AI原生应用

近年来&#xff0c;随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI的应用逐渐渗透到各行各业。作为一种全新的开发模式&#xff0c;AI原生应用正逐步成为行业的焦点。在这方面&#xff0c;FASTGPT无疑是一款颇具代表性的产品。本文将详细介绍FASTGPT的设…

再说零信任

什么是零信任&#xff1f; 2010年&#xff0c;由著名研究机构Forrester的首席分析师John Kindervag最早提出了零信任(Zero Trust)的概念&#xff0c; 并由Google在BeyondCorp项目中率先得到了应用&#xff0c;很好的解决了边界安全理念难以应对的安全问题。 我们的网络无时无…

C++多线程同步

C使用多线程必须包含头文件 #include <thread> 来实现 当多个线程同事访问一个对象的时候&#xff0c;会产生数据竞争现象。 这个时候&#xff0c;就可以加锁&#xff0c;同步资源&#xff0c;解决数据竞争。 最简单就是互斥锁mutex 上代码&#xff0c;计算一个数自增到1…

3d模型批量渲图总是会跳怎么办?---模大狮模型网

在进行3D模型批量渲染时&#xff0c;有时会遇到一些问题&#xff0c;其中一个常见的问题就是渲染过程中出现跳帧或者跳图的情况。这不仅会影响到效率&#xff0c;还可能导致输出结果不符合预期。本文将介绍几种解决这一问题的方法&#xff0c;帮助读者更好地应对3D模型批量渲图…

union all 以及标量子查询执行计划

SELECT 1, (SELECT ID1 FROM TE WHERE IDA.ID2) FROM .TA A WHERE COLA X UNION ALL SELECT 1, (SELECT ID2 FROM TD WHERE IDA.ID1) FROM .TB A WHERE COLA X UNION ALL SELECT 1,COL2 AS PARENT_UUID FROM .TC a WHERE COLA X 三个union all 看着像是5个table joi…

正则表达式-是什么?规则有哪些?

正则表达式&#xff08;Regular Expression&#xff0c;常简写为regex、regexp或RE&#xff09;是一种文本模式&#xff0c;包括普通字符&#xff08;如a到z之间的字母&#xff09;和特殊字符&#xff08;称为“元字符”&#xff09;&#xff0c;用于描述、匹配一系列符合某个句…

鸿蒙Ability Kit(程序框架服务)【ExtensionAbility组件】

ExtensionAbility组件 ExtensionAbility组件是基于特定场景&#xff08;例如服务卡片、输入法等&#xff09;提供的应用组件&#xff0c;以便满足更多的使用场景。 每一个具体场景对应一个[ExtensionAbilityType]&#xff0c;开发者只能使用&#xff08;包括实现和访问&#…

跨平台,不需要下载的串口调试助手

在线串口调试助手是BBAIoT旗下的首款物联网工具&#xff0c;web端显示&#xff0c;不需要下载任何软件到电脑&#xff0c;方便快捷。 在线串口调试 链接地址&#xff1a;在线串口调试在线串口调试助手 Online serial port debugging assistanthttps://www.bbaiot.com/ 软件界…

转行要趁早?2024网络安全热门岗位大盘点

2024年 热门网络安全职位排名 TOP5 热门****程度&#xff1a; 幕后默默守护的工匠&#xff01;构建安全的网络堡垒&#xff0c;跨团队合作&#xff0c;让安全防线更加坚固。 安全架构师的工作是发现企业内潜在的 IT 和网络漏洞。他们与自己团队的其他科技专业人士合作&#x…

[FreeRTOS 基础知识] 栈

文章目录 栈的概念使用C语言实现 栈通过代码反汇编解析 栈 栈的概念 所谓的栈就是一块空间的内存&#xff0c;CPU的SP寄存器指向它&#xff0c;它可以用于函数调用&#xff0c;局部变量&#xff0c;多任务系统里保存现场。 使用C语言实现 栈 volatile int num0;int fun_b(vol…

大模型ChatGLM的部署与微调

前言&#xff1a;最近大模型太火了&#xff0c;导师让我看看能不能用到自己的实验中&#xff0c;就想着先微调一个chatGLM试试水&#xff0c;微调的过程并不难&#xff0c;难的的硬件条件跟不上&#xff0c;我试了一下lora微调&#xff0c;也算跑通了吧&#xff0c;虽然最后评估…

聚类算法—DBSCAN算法

文章目录 DBSCAN算法基本概念1个核心思想&#xff1a;基于密度2个算法参数&#xff1a;邻域半径R和最少点数目minpoints3种点的类别&#xff1a;核心点&#xff0c;边界点和噪声点4种点的关系&#xff1a;密度直达&#xff0c;密度可达&#xff0c;密度相连&#xff0c;非密度相…

2024-6-3 石群电路-22

2024-6-3&#xff0c;星期一&#xff0c;20:45&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;阴转晴。今天没有发生了一些令人不开心事情&#xff0c;心情有些差&#xff0c;不过还是调整过来了&#xff0c;活好自己&#xff0c;就是对你讨厌的人最大的惩罚。因为…

jdk的组成和跨平台原理

为什么 1.笔试会用到 2. 方便理解程序的运行 java跨平台的原因&#xff1a; sun公司提供了各种平台可以使用的jvm,所以java将程序一次编译成字节码之后可以给各种平台运行。这也是java这么多年深受欢迎的原因

GB28181安防视频融合汇聚平台EasyCVR如何实现视频画面自定义标签?

安防视频融合汇聚平台EasyCVR兼容性强&#xff0c;可支持Windows系统、Linux系统以及国产化操作系统等&#xff0c;平台既具备传统安防视频监控的能力&#xff0c;也具备接入AI智能分析的能力&#xff0c;可拓展性强、视频能力灵活&#xff0c;能对外分发RTMP、RTSP、HTTP-FLV、…