如何计算4 * 4矩阵状态的Grundy数。有效的移动包括将1s转换为具有全1的子矩阵的0。
示例:
1010
0011
0000
0000
Grundy Number = 2
我检查了较小的情况,并为此计算了Grundy数,但无法对任何二进制4 * 4矩阵进行扩展。所以,请帮我计算一下。
注意:只能在子矩阵中将1转换为0.
答案 0 :(得分:1)
Grundy数字是通过可到达的位置递归计算的:
从最终位置(全零)开始,这是一个损失(0)。
0 0 0 0
0 0 0 0 = 0
0 0 0 0
0 0 0 0
继续向矩阵添加一个以获取其他配置的值。一些例子只有一个。
1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 = 0 0 0 0 = 0 0 1 0 = 0 0 0 1 = 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
对于两个1,我们必须区分1是否相邻,并且可以一次移除。
1 0 1 0 1 0 0 0 1 0 0 0* 0 0 1 0
0 0 0 0 = 0 0 1 0 = 0 0 0 1 = 0 0 0 1 = 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 = 0 0 1 1 = 2
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
三个或更多1个相同。
1 0 1 0*
0 0 0 1 = 1
0 0 0 0
0 0 0 0
1 0 1 0* 1 0 0 0* 0 0 1 0*
0 0 1 0 = 0 0 1 1 = 0 0 1 1 = 3
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
最后我们可以评估给定的矩阵。示例中的可到达位置标有星号*
。所以我们可以很容易地看到我们正在寻找的数字是 mex(0,1,3)= 2 。
1 0 1 0
0 0 1 1 = 2
0 0 0 0
0 0 0 0
伪程序可能看起来很简单(grundy函数必须支持标量状态和数组或状态向量才能工作):
grundy(0) = 0
grundy(state) = mex(grundy(reachableStates(state)))