nim游戏及其进阶 [SDOI2011] 黑白棋 [SDOI2019] 移动金币

最近在做博弈题单,遇到了这两个nim问题。

SDOI2019\] 移动金币 被成为阶梯nim,也就是一个 n n n堆石子在不同的阶梯上面,每次操作可以选择一堆中若干个石子合并到低一级的阶梯(如果移动到地面就不能再移动),不能操作者失败。 这个问题我大概思考了一天就解决了,容易发现n=2时必败态为第一级阶梯为0,因为这样先手移动任何石子下来后手都能移到地面。把n拓展到更大,就会发现偶数级阶梯(现在假设地面为第0级阶梯)的石子时没有意义的,因为如果把偶数的石子移到奇数的石子能形成更好的局面,那么后手就能把这些石子再往移动一级,可以依次从第二级,第四级往下递推思考。 也就是说只用考虑奇数级阶梯的石子,又因为把石子移到偶数级的阶梯以后没有意义,那么就变成了在偶数级阶梯进行经典的nim操作,因此必败态就是所有偶数级阶梯的异或和。 \[SDOI2019\] 移动金币 被称为k-nim也就是每次可以取不超过k堆的石子。我花了大概一周才解决,感觉非常让人抓狂,最后是在操场上散步突然想到结论的。这个结论现在还没有想好怎么证明,后续补上。 感觉这个问题打表比较困难,不过我想了一种直接打出必败态的方法。 ```cpp #include #define ll long long using namespace std; const int V = 8, N = 1e6 + 10; int n, m; int a[15]; int cnt, b[N][15], f[N], g[N]; int calc(int p1, int p2) { int ret = 0; for (int i = 1, j = 1; i <= n; i++) { while (j <= n && b[p1][i] > b[p2][j]) j++; if (j <= n && b[p1][i] == b[p2][j]) { ret++; j++; } } return n - ret; } void dfs(int k, int last) { if (k == n + 1) { cnt++; g[cnt] = 0; for (int i = 1; i <= n; i++) { b[cnt][i] = a[i]; g[cnt] ^= a[i]; } f[cnt] = 2; for (int i = 1; i < cnt; i++) { if (f[i] == 1) continue; bool ok = 1; for (int j = 1; j <= n; j++) { if (b[i][j] > b[cnt][j]) { ok = 0; break; } } if (ok && calc(i, cnt) <= m) { f[cnt] = 1; break; } } if (f[cnt] == 1) { cnt--; } return; } for (int i = last; i <= V; i++) { a[k] = i; dfs(k + 1, i); } } int main() { // freopen("out.out", "w", stdout); ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; dfs(1, 0); for (int i = 1; i <= cnt; i++) { bool bk = 1; for (int ki = 10; ki >= 0; ki--) { int ret = 0; for (int j = 1; j <= n; j++) { if (b[i][j] >> ki & 1) { ret++; } } if (ret % (m + 1) != 0) { cout << "wa\n"; } } if (f[i] == 2) { cout << f[i] << " " << g[i] << " : "; for (int j = 1; j <= n; j++) { cout << b[i][j] << " \n"[j == n]; } } } cout << cnt << endl; } ``` 很早的时候我就想到了如果每一堆都是1,那么必败态就是n%(d+1)=0,说明结论还与n和d有关系(虽然应该和n没有关系,不过我当时就觉得它们有关系)。 然后想到一个比较奇怪的事情,以前学nim的时候我就一直十分不解为什么结论会和xor有关系(因为异或是一个二进制的操作),因为异或实际上是把每位相加再模二,然后就感觉可能会是模数变化(变成d+1)这样操作了肯定就不为全为0了,或者是进制变化(比如变成d+1进制之类的)。 而且前面打表的时候也发现必败态里面往往没有8的出现,所以更加肯定是模数改变。 验证了一下发现是正确的,然后就ac了。

相关推荐
BingLin-Liu15 小时前
蓝桥杯备考---》贪心算法之矩阵消除游戏
算法·游戏·贪心算法
苹果企业签名分发1 天前
游戏搭建云服务器配置推荐
运维·服务器·游戏
二狗哈1 天前
go游戏后端开发20:房间消息推送处理
开发语言·游戏·golang
fatiaozhang95272 天前
晶晨S905L3A(B)-安卓9.0-开启ADB和ROOT-支持IPTV6-支持外置游戏系统-支持多种无线芯片-支持救砖-完美通刷线刷固件包
android·游戏·adb·华为·电视盒子·机顶盒rom·魔百盒固件
腾讯安全应急响应中心2 天前
命悬生死线:当游戏遭遇DDoS围剿,如何用AI破局?
网络·人工智能·游戏·ddos
徐礼昭|商派软件市场负责人3 天前
2025年消费观念转变与行为趋势全景洞察:”抽象、符号、游戏、共益、AI”重构新世代消费价值的新范式|徐礼昭
大数据·人工智能·游戏·重构·零售·中产阶级·消费洞察
CodeCaptain3 天前
[推荐了解]各类游戏引擎入门选择说明
经验分享·游戏
zzj_2626104 天前
Java课程设计(双人对战游戏)持续更新......
java·游戏·课程设计
米芝鱼4 天前
LearnOpenGL(九)自定义转换类
开发语言·c++·算法·游戏·图形渲染·shader·opengl
Footprint_Analytics5 天前
3.17-3.23 Web3 游戏周报:Pixudi 双榜领跑,The Forgotten Runiverse 登陆三大主机平台
游戏·web3