main
黄海 2 years ago
parent 234b2167c1
commit ca23979c24

@ -53,7 +53,8 @@ win
如图:
<center><img src='https://cdn.acwing.com/media/article/image/2020/06/25/30334_2388c086b6-%E6%97%A0%E6%A0%87%E9%A2%98.png'></center>
例图解释:
**例图解释**
$SG(5)=mex({\phi})=0$
$SG(3)=mex({SG(5)})=mex({0})=1$
$SG(4)=mex({SG(5),SG(3)})=mex({0,1})=2$
@ -67,7 +68,9 @@ $SG(1)=mex({SG(2),SG(4)})=mex({0,2})=1$
**证明**
首先,由于这是一张有向无环图,所以游戏最后一定会结束,也就是说每个棋子最后都会移动到一个点上,且该点没有任何能到达的点。
那么根据定义,结束状态的所有点的 $SG$ 函数值异或起来为 $0$,做法对于结束状态可行。
根据定义,结束状态的所有点的 $SG$ 函数值异或起来为 $0$**做法对于结束状态可行**。
所以接下来,只要证明出
- ① 任何一种每个棋子所在点的 $SG$ 函数值异或起来非 $0$ 的情况,一定能通过一次移动棋子,到达一个 每个棋子所在点的 $SG$ 函数值异或起来为 $0$ 的情况
@ -79,15 +82,15 @@ $SG(1)=mex({SG(2),SG(4)})=mex({0,2})=1$
**证明** $1$
设每个棋子所在点的 $SG$ 函数值分别为 $a_1,a_2,⋯,a_n$
设 $x=a_1 XOR a_2 XOR  XOR a_n$设 $x$ 的最高位为第 $k$ 位,那么在 $a_1,a_2,⋯,a_n$ 中,一定有一个值的第 $k$ 位为 $1$
设该值为 $a_i$,那么由于 $x$ 的第 $k$位和 $a_i$ 的第 $k$ 位都是 $1$,且第 $k$ 位是 $x$ 的最高位,所以 $a_i XOR x$ 一定小于 $a_i$
设 $x=a_1 XOR a_2 XOR  XOR a_n$**此时$x$一定不等于$0$**
设 $x$ 的最高位为第 $k$ 位,那么在 $a_1,a_2,⋯,a_n$ 中,一定有一个值的第 $k$ 位为 $1$。
设该值为 $a_i$,那么由于 $x$ 的第 $k$位和 $a_i$ 的第 $k$ 位都是 $1$,且,第 $k$ 位是 $x$ 的最高位,所以 $a_i XOR x$ 一定小于 $a_i$
又因为 $a_i$ 是其中一个棋子所在点的 $SG$ 函数值,那么根据 $SG$ 函数值的定义,该点能到达的所有点中,一定存在一个点的 $SG$ 函数值为 $a_i XOR x$
那么我们就可以将该点上的棋子,移到一个 $SG$ 函数值为 $a_i XOR x$ 的点上去
移完之后,原来每个棋子所在点的 $SG$ 函数异或值就变为了 $a_1 XOR a_2 XOR  XOR a_{i1} XOR (a_i XOR x) XOR a_{i+1}  XOR a_n$
**移完之后**,原来每个棋子所在点的 $SG$ 函数异或值就变为了 $a_1 XOR a_2 XOR  XOR a_{i1} XOR (a_i XOR x) XOR a_{i+1}  XOR a_n$
$=(a_1 XOR a_2 XOR  XOR a_n) XOR x=x XOR x=0$
@ -101,18 +104,11 @@ $=(a_1 XOR a_2 XOR  XOR a_n) XOR x=x XOR x=0$
所以做法是正确的。
那么如何求出每个点的 $SG$ 函数值呢?
#### 3、如何求出每个点的 $SG$ 函数值呢?
记忆化搜索就好啦~
每层记忆化搜索中,如果该点的 $SG$ 函数值已经被计算出,那就直接返回该值。否则用一个 $set$ 记录每个点能到的所有点的 $SG$ 函数值集合,然后从 $0$ 开始遍历,找到第一个 $set$ 里面没有的数,将该值记录在该点上并返回。
#### 3、回到本题
- 如果只有一个棋子(棋子位置是$s$
先手必胜 $\Leftrightarrow $ `sg(s)!=0`
- 存在多个棋子(其实可以看成存在多个相同的棋盘,棋子的位置是$s_1,…,s_k$
先手必胜 $\Leftrightarrow $ `sg(s1)^sg(s2)^...^sg(sk) != 0`
### 三、实现代码
```cpp {.line-numbers}
#include <bits/stdc++.h>

Loading…
Cancel
Save