打卡信奥刷题(3136)用C++实现信奥题 P7589 黑白棋(2021 CoE-II B)
P7589 黑白棋(2021 CoE-II B)
题目描述
Alice\text{Alice}Alice 和 Bob\text{Bob}Bob 正在玩一种称为“黑白棋”的游戏。该游戏的规则如下:
-
游戏在直角坐标系中进行。
-
Alice\text{Alice}Alice 执黑棋,Bob\text{Bob}Bob 执白棋。
-
初始时,在直角坐标系中任选 nnn 条与 XXX 轴平行的直线,直线在 YYY 轴上的截距均为整数,且互不相同。Alice\text{Alice}Alice 在每条直线上都会放置一枚黑棋,Bob\text{Bob}Bob 在每条直线上都会放置一枚白棋,棋子位置的 XXX 坐标值均为整数。在同一条直线上的两枚棋子位置不会相同。
-
Alice\text{Alice}Alice 和 Bob\text{Bob}Bob 轮流走棋,Alice\text{Alice}Alice 总是先走棋。每名玩家在走棋时,先选择一条直线,然后沿着直线移动该条直线上己方颜色的棋子。
-
每个玩家可以将自己的棋子向着靠近对方棋子的方向一次性移动若干整数单位距离,称之为前进。每个玩家也可以向着远离对方棋子的方向一次性移动若干整数单位距离,称之为后退。只要在前进时不跨过对方的棋子,也不使黑棋和白棋的位置发生重叠,前进的最远距离不限,但是前进的距离至少为 111,如果无法满足前述条件,则玩家不能执行前进操作。为了避免玩家反复后退导致游戏无法结束,在一局游戏中,某个玩家执行后退操作的总次数不能超过 kkk 次。与此同时,为了防止游戏区域太大以致在显示游戏状态上造成不便,每次后退的距离至少为 111,但不能超过 ddd。如果无法满足前述条件,玩家不能执行后退操作。
-
玩家在轮到自己走棋时,如果能够执行操作就必须执行一次操作,此操作可以是前进操作,也可以是后退操作(如果未超出后退次数的限制)。
-
如果某个玩家无法执行任何操作来移动自己的棋子,将输掉游戏,游戏结束。
给定游戏的初始状态,假设 Alice\text{Alice}Alice 和 Bob\text{Bob}Bob 在游戏时均采用最佳策略,试确定 Alice\text{Alice}Alice 能否获胜。
输入格式
输入包含多组测试数据。
输入第一行包含一个整数 TTT,表示测试数据的组数。接着是一个空行。接下来是 TTT 组表示游戏初始状态的数据。
每组数据的第一行包含三个整数 nnn,kkk,ddd,表示直线的数量,允许后退的总次数,每次后退的最大距离。接下来是 nnn 行数据,每行包含三个整数 yiy_iyi,bib_ibi,wiw_iwi,分别表示第 iii 条直线的 YYY 轴截距以及在该条直线上的黑棋的 XXX 坐标值和白棋的 XXX 坐标值(bi≠wib_i \ne w_ibi=wi)。
每两组测试数据之间有一个空行。
输出格式
如果 Alice\text{Alice}Alice 能够获胜,输出 Yes,否则输出 No。
输入输出样例 #1
输入 #1
2
2 0 10
3 4 8
7 7 5
3 5 15
-3 -9 -19
-7 10 21
12 12 16
输出 #1
Yes
No
说明/提示
样例说明
下图对应输入 #1 的第一组数据,如果 Alice\text{Alice}Alice 采用最优策略,无论 Bob\text{Bob}Bob 如何走棋,Alice\text{Alice}Alice 都能够获胜。

以下是 Alice\text{Alice}Alice 的必胜策略。首先,Alice\text{Alice}Alice 选择将 y=3y=3y=3 的直线上的黑棋从 4 移动到 6,使得两条直线上黑棋和白棋之间的间距均为 222,由于 kkk 为 000,相当于不允许执行后退操作,如果 Bob\text{Bob}Bob 选择移动 y=3y=3y=3 直线上的白棋,将使得该直线上的两颗棋子相邻,后续无法再移动。同样的,如果 Bob\text{Bob}Bob 选择移动 y=7y=7y=7 直线上的白棋,也将使得该直线上的两颗棋子相邻,后续无法再移动。因此无论 Bob\text{Bob}Bob 如何操作,总会使得一条直线上的两颗棋子相邻,无法再继续移动,而另外一条直线上的棋子间距为 222,还可以再移动一次,Alice\text{Alice}Alice 将剩下可以移动的黑棋再移动一步后,后续 Bob\text{Bob}Bob 无法移动白棋,因此 Alice\text{Alice}Alice 会获胜。
对于输入 #1 的第二组数据,无论 Alice\text{Alice}Alice 如何走棋,Bob\text{Bob}Bob 总能够获胜。
数据范围
对于 100%100\%100% 的数据,1≤T≤1001 \le T \le 1001≤T≤100,1≤n≤1001 \le n \le 1001≤n≤100,0≤k≤1000 \le k \le 1000≤k≤100,1≤d≤201 \le d \le 201≤d≤20,−100≤yi≤100-100 \le y_i \le 100−100≤yi≤100,−103≤bi≤103-10^3 \le b_i \le 10^3−103≤bi≤103,−103≤wi≤103-10^3 \le w_i \le 10^3−103≤wi≤103。
C++实现
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t , a , b , c , d , e;
int read()
{
long long X = 0 , w = 1;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
w = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
X = X * 10 + c - '0' , c = getchar();
return X * w;
}
signed main()
{
t = read();
while(t--)
{
a = read() , b = read() , c = read() , b = 0; //输入
for(int i = 0;i < a;i++)
c = read() , d = read() , e = read() , b ^= ((d < e)?(e - d - 1):(d - e - 1));
puts((b)?"Yes":"No");
}
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)