HDU 1730 Northcott Game

HDU1730 Northcott Game

图1

图2

一、解题思路

  • 把同一行棋子之间的距离看做石子数。两个棋子紧挨着,就表示这堆石子个数为零。否则石子数量就是白色棋子坐标与黑色棋子坐标差+1。

  • 如果黑棋选择扩大距离(向左走)
    白棋足够聪明,直接跟进,贴上黑棋,这样,本行黑棋不管怎么操作,都会被跟进,直到遇到左侧边界,那么,黑棋将在本行无路可走,只能再去其它行尝试,也就是黑棋在本行没有占到便宜,被迫进入下一行。换句话说,在本题中不能扩大距离,只能缩小距离,即拿走一些石子。

  • 如果黑棋选择缩小距离(向右走)
    对比Nim游戏,就是拿走一些石子,一共有N堆石子,每次只能从某一堆中拿走一些石子(>=1 && <=a[i])个。问是先手必胜,还是先手必败,这不就是经典的Nim游戏吗?

直接以坐标差+1做为石子个数,构建Nim游戏,计算异或和,是0则先手必败,否则先手必胜。

二、模拟第二组数据, 黑棋是怎么赢的

#include <bits/stdc++.h>

using namespace std;
int main() {
    int res = 2 ^ 0 ^ 0;
    printf("%d\n", res);           //异或和
    printf("%d\n", res ^ 2);       //剩余几个 输出0
    printf("%d\n", 2 - (res ^ 2)); //取走几个 输出2
    return 0;
}

三、实现代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, m;
    while (~scanf("%d %d", &n, &m)) {
        int res = 0;
        for (int i = 1; i <= n; ++i) {
            int a, b;
            scanf("%d %d", &a, &b);
            res = res ^ (abs(a - b) - 1);
        }
        if (res == 0)
            puts("BAD LUCK!");
        else
            puts("I WIN!");
    }
    return 0;
}
posted @   糖豆爸爸  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2019-06-23 在上传前探测磁盘是否挂载正常
2014-06-23 在JAVASCRIPT中构建一个复杂的对象,并用JSON进行转换
Live2D
点击右上角即可分享
微信分享提示