题解 | #大撒币#

大撒币

https://www.nowcoder.com/practice/ff0f60d80ee94d94aba959b2b4c1941a

这是一个经典的博弈论问题,通常被称为“圆桌硬币游戏”或“对称博弈”。

这个问题的核心在于利用几何对称性来制定必胜策略。

基本逻辑: 这是一个公平组合游戏(Impartial Game),游戏在有限步骤内结束,没有平局,且信息完全公开。我们需要判断先手(Alice)是否有必胜策略。

情况分析:

  1. 无法放置第一枚硬币的情况: 如果桌子的长 或宽 小于硬币的直径 ,那么桌子上连一枚硬币都放不下。

    • 在这种情况下,作为先手的 Alice 没有任何合法的操作空间。
    • 根据游戏规则,无法进行操作的玩家判负。
    • 结论: Bob 获胜。
  2. 可以放置至少一枚硬币的情况: 如果桌子足够大(即 ),Alice 可以利用对称性策略必胜。

    • 第一步(占领中心): Alice 将第一枚硬币准确地放置在矩形桌子的几何中心
    • 后续策略(中心对称): 无论 Bob 接下来将硬币放在桌子的哪个位置,Alice 都在该位置关于桌子中心对称的地方放置一枚硬币。
    • 为什么这总是合法的?
      • 由于桌子是中心对称图形,且第一枚硬币占据了中心位置,剩余的可用空间也是关于中心对称的。
      • 如果 Bob 能在某个位置 合法放置一枚硬币(即不与现有硬币重叠且在边界内),那么根据对称性,位置 关于中心的对称点 也一定在边界内。
      • 同时,因为之前的状态(包括中心硬币和之前成对放置的硬币)都是中心对称的,所以如果 不与任何旧硬币重叠, 也不会与任何旧硬币重叠。
      • 此外, 不会重叠,除非它们是同一个位置(即中心),但中心已经被 Alice 的第一枚硬币占据了。
    • 结果: 只要 Bob 能做出一个合法操作,Alice 就能做出一个对应的对称操作。由于桌子面积有限,硬币数量无限但空间有限,游戏终将结束。Bob 最终会面临无处可放的局面。
    • 结论: Alice 获胜。

代码实现:

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

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

    ll a, b, r;
    cin >> a >> b >> r;

    if (2 * r > a || 2 * r > b) {
        cout << "Bob\n";
    } else {
        cout << "Alice\n";
    }
}
每日一题@牛客网 文章被收录于专栏

牛客网每日一题

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务