矩阵的格兰迪数

时间:2017-03-04 12:29:09

标签: algorithm game-theory submatrix nim-game

如何计算4 * 4矩阵状态的Grundy数。有效的移动包括将1s转换为具有全1的子矩阵的0。

示例:

1010
0011
0000
0000

Grundy Number = 2

我检查了较小的情况,并为此计算了Grundy数,但无法对任何二进制4 * 4矩阵进行扩展。所以,请帮我计算一下。

注意:只能在子矩阵中将1转换为0.

1 个答案:

答案 0 :(得分:1)

Grundy数字是通过可到达的位置递归计算的:

  1. 从最终位置(全零)开始,这是一个损失(0)。

    0 0 0 0
    0 0 0 0   =   0
    0 0 0 0
    0 0 0 0
    
  2. 继续向矩阵添加一个以获取其他配置的值。一些例子只有一个。

    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
    
  3. 对于两个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
    
  4. 三个或更多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
    
  5. 最后我们可以评估给定的矩阵。示例中的可到达位置标有星号*。所以我们可以很容易地看到我们正在寻找的数字是 mex(0,1,3)= 2

    1 0 1 0
    0 0 1 1   =   2
    0 0 0 0
    0 0 0 0
    
  6. 伪程序可能看起来很简单(grundy函数必须支持标量状态和数组或状态向量才能工作):

    grundy(0) = 0
    grundy(state) = mex(grundy(reachableStates(state)))