P8144 [JRKSJ R4] BBWWBB 题解
题目链接
link
题目大意
六个棋子,分布于数轴上六个位置,颜色从左至右依次为 BBWWBB,两名玩家轮流操作己方棋子,左移或右移一个单位长度,直到一方无棋可动,另一方获胜。
分析
观察&猜测
首先,观察询问,题目只需要回答游戏是否会无限进行下去,所以我们无需考虑具体过程。
仔细阅读样例解释,出题人分别举了两种结果各一个例子
- W 被 B 全数消灭,输出
No。 - W 逃脱,输出
Yes。
由此我们可以大致猜测,因为 W 棋子少于 B 棋子,所以结果不是 W 被全数消灭,就是 W 成功逃脱,不存在 B 被 W 消灭的情况。
分情况讨论
是否存在一种情况使得 B 被 W 尽数消灭呢?我们看下图
显而易见,对于单颗 W ,要么主动送死,要么与 B 换子。
显然,若 W 坐以待毙,左右的 B 迟早会强迫 W 与之换子(如上图第二块),此时 B 获胜。所以,W 必须主动出击。
W 很容易就能形成 WW,此时可以与黑强制换一子(如上图),但此后又陷入了图一的情况。
难道 W 就不可能逃脱吗?肯定不是,再次观察样例解释2,出现了以下情况:
关键:先手 W 并且有 W 与一个且仅有一个 B 相邻(与两个 B 相邻,见图2),此时,W 便可以顺利逃脱。
这里可能有读者有疑问:在上图第二步时如果后方 B 追上来怎么办。
因为这里是两个 W 移动,所以移动速度平均为
另外还有一种情况:
不言而喻
结论
因为 W 逃脱条件更少,我们判 W 是否能顺利逃脱。
- W 先手
- 开局有且仅有一个 B 与 W 相邻
Code
#include<bits/stdc++.h>
int pos[7],T;char c;
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);std::cout.tie(0);
std::cin>>T;
while(T--)
{
std::cin>>c;
for(int i=1;i<=6;i++) std::cin>>pos[i];
if ((c=='W')//W 先手
&& ((pos[3]-pos[2]==1&&pos[2]-pos[1]>1)
|| (pos[5]-pos[4]==1&&pos[6]-pos[5]>1))//有
&&(!(pos[3]-pos[2]==1&&pos[5]-pos[4]==1)))//且仅有一侧与W相邻
std::cout<<"Yes\n";
else std::cout<<"No\n";
}
return 0;
}