[博弈论] 矩形消除游戏:策略窃取与先手必胜证明
[博弈论] 矩形消除游戏:策略窃取与先手必胜证明
TAG:博弈论、策略窃取、Chomp、思维题
题型:有限二人零和完全信息博弈
题目描述
Alice 和 Bob 在一个 \(n\times m\) 的点阵上玩游戏。
点阵共有 \(n\) 行、\(m\) 列,左上角的点记为 \((1,1)\)。Alice 先手,两人轮流进行操作。
每次操作时,当前玩家选择一个仍然存在的点 \((x,y)\),并删除所有满足
的点 \((i,j)\)。因此,删除区域包含选中的点本身,也包含它右下方的所有点。
左上角的点 \((1,1)\) 是“毒点”:选择并删除 \((1,1)\) 的玩家立即失败。
假设双方都采用最优策略,判断谁能获胜。
一、先从小局面开始尝试
1. \(1\times1\)
棋盘上只有毒点 \((1,1)\)。Alice 没有安全操作,只能选择毒点,因此立即失败。
所以 \(1\times1\) 是先手必败态。
2. \(1\times2\)
Alice 可以选择 \((1,2)\),只删除这个点,棋盘中只剩毒点。
Bob 接下来只能选择毒点,所以 Bob 失败,Alice 获胜。
同理,\(2\times1\) 也是先手必胜态。
3. 更大的矩形
直接枚举具体操作会迅速变得困难。一次操作以后,剩余区域不一定还是矩形,而可能是左上角对齐的阶梯形:
● ● ● ●
● ● × ×
● ● × ×
如果试图对所有阶梯形局面计算胜负,状态数量会很大。
但题目只问完整矩形的初始局面,这给了我们一个更有力的切入点:完整矩形存在一个特殊的最右下角点 \((n,m)\),并且任意非毒点操作都会覆盖它。
这正是策略窃取证明所需的结构。
二、局面的表示与基本性质
对于一个仍然存在的点集 \(S\),选择 \((x,y)\) 时删除的点集记为
操作后的局面为
游戏每次至少删除一个点,所以点数严格减少。棋盘有限,因此游戏一定会在有限步内结束,不可能出现循环或平局。
于是,每个局面都可以递归地划分为:
- 必胜态:存在一个不选择毒点的安全操作,使对手进入必败态;
- 必败态:不存在这样的安全操作。
特别地,只剩毒点时,当前玩家没有安全操作,所以这是必败态。
三、抓住关键:最右下角点的“可吸收性”
假设 \(nm>1\),那么最右下角点
不是毒点,可以被安全选择。
更关键的是,对于矩形中的任意点 \((x,y)\),都有
所以
也就是说,无论之后选择哪个仍存在的点,它的删除区域都会包含原来的最右下角点。
因此,先单独删掉 \(z\),再选择 \((x,y)\),与一开始直接选择 \((x,y)\) 的结果完全相同:
其中第二个等号使用了 \(z\in D(x,y)\)。
这条“额外删除的最右下角点会被后续操作吸收”的性质,是整个策略窃取证明的核心。
四、策略窃取证明
下面证明:只要 \(nm>1\),完整矩形一定是 Alice 的必胜态。
设初始完整矩形局面为 \(R\)。反设 \(R\) 是必败态。
第一步:Alice 先删最右下角点
Alice 选择
由于 \(z\) 位于最右下角,这次只会删除 \(z\) 自己。操作后的局面记为
我们反设 \(R\) 是必败态,因此从 \(R\) 进行任意安全操作,都会把一个必胜态交给对手。
所以,轮到 Bob 面对的 \(S\) 必须是必胜态。
第二步:假想 Bob 在 \(S\) 中使用必胜策略
因为 \(S\) 是必胜态,所以 Bob 一定存在某个安全操作 \((x,y)\),使操作后的局面 \(T\) 是必败态:
这里的 \((x,y)\) 不可能是毒点,因为选择毒点会让 Bob 立即失败,不可能成为必胜操作。
第三步:Alice 窃取这个操作
回到最初的完整矩形 \(R\)。
Alice 不再先删 \(z\),而是第一步直接选择刚才 Bob 的操作 \((x,y)\)。
由于 \(z=(n,m)\in D(x,y)\),有
所以 Alice 在初始局面直接选择 \((x,y)\),也能得到完全相同的必败态 \(T\),并把它交给 Bob。
这说明 \(R\) 中存在一步把对手送入必败态的操作,因此 \(R\) 应当是必胜态,与“\(R\) 是必败态”的反设矛盾。
所以反设不成立。
因此,只要 \(nm>1\),完整矩形一定是 Alice 的必胜态。
五、为什么称为“策略窃取”
证明没有直接算出 Alice 第一步究竟应该选择哪个点,而是进行了如下推理:
- 假设 Alice 没有必胜策略;
- Alice 先进行一个不会妨碍后续操作的试探操作;
- 在假设下,Bob 应当拥有某个必胜操作;
- Alice 发现自己可以在第一步直接执行 Bob 的这个操作;
- 于是 Alice“窃取”了本应属于 Bob 的策略,得到矛盾。
所以,这个证明给出的是:
Alice 的必胜第一步一定存在。
但它通常不能高效告诉我们:
Alice 的必胜第一步具体是哪一步。
这也是经典 Chomp 游戏最著名的特点之一:策略窃取可以证明任意非平凡矩形中先手必胜,但并未同时给出一般情形下的显式必胜策略。
六、为什么试探操作必须选 \((n,m)\)
策略窃取并不是随便先走一步都能成立。
我们需要试探操作删掉的点满足:
无论 Bob 随后选择哪个点,这个点都会被 Bob 的删除区域一并删除。
在完整矩形中,\((n,m)\) 位于所有点的右下方,因此任意删除区域 \(D(x,y)\) 都包含它。
如果 Alice 第一步删掉的是其他点 \((a,b)\),那么 Bob 的后续操作可能位于它的下方但左侧,或者右侧但上方,从而不删除 \((a,b)\)。这时“两步操作”和“直接执行第二步”得到的局面未必相同,策略便无法窃取。
因此,最右下角点的选择不是巧合,而是由删除关系决定的。
七、完整结论
最终胜负为
证明可以概括为:
- \(1\times1\) 中 Alice 被迫选择毒点,因此失败;
- 当 \(nm>1\) 时,若假设完整矩形是必败态,Alice 可以先删最右下角点,再窃取 Bob 在新局面中的必胜操作;
- 由于 Bob 的操作本来就会覆盖最右下角点,Alice 可以在原局面直接执行该操作,得到同一个必败态;
- 产生矛盾,因此完整矩形一定是先手必胜态。
八、算法实现
如果题目只要求判断初始完整矩形的胜负,就不需要搜索所有阶梯形状态,只需判断棋盘是否只有毒点。
参考代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
void solve(){
int n,m;
cin>>n>>m;
if(n==1&&m==1) cout<<"Bob"<<endl;
else cout<<"Alice"<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T=1;
// cin>>T;
while(T--) solve();
return 0;
}
如果原题包含多组测试数据,只需取消 cin>>T; 前的注释。
复杂度分析
- 时间复杂度:\(O(1)\);
- 空间复杂度:\(O(1)\)。
九、易错点
1. 删除区域包含选中的点
这里删除的是
因此 \((x,y)\) 本身也会被删除。
2. 这是毒点规则,不是普通无子可走规则
选择 \((1,1)\) 的玩家立即失败。等价地分析安全操作时,可以把“只剩毒点”看作当前玩家的必败态。
3. 策略窃取依赖初始局面是完整矩形
对于任意阶梯形局面,未必存在一个能被所有后续操作覆盖的安全点,因此不能直接照搬这个证明。
4. 证明了必胜,不等于构造了必胜操作
如果题目要求输出完整操作方案,仅凭策略窃取的存在性证明还不够;还需要额外寻找具体策略。
5. 不需要计算 SG 函数
SG 函数通常用于普通规则下的无偏组合游戏,尤其是多个独立子游戏的异或合并。本题既有毒点规则,又只需判断完整矩形的初始胜负,策略窃取已经足够。

浙公网安备 33010602011771号