给定一个 4×4 的二进制矩阵。两个玩家 A 和 B 正在玩游戏,在每一步,玩家都可以选择任何一个全为 1 的矩形并将所有 1 替换为 0。不能选择任何矩形的玩家输掉游戏。假设他们都以最佳方式玩游戏并且 A 开始游戏,则预测游戏中的获胜者。
例子:
Input :
0 1 1 0
0 0 0 0
0 0 0 0
0 0 0 1
Output : A
Step 1: Player A chooses the rectangle with a single one at position (1, 2), so the new matrix becomes
0 0 1 0
0 0 0 0
0 0 0 0
0 0 0 1
Step 2: Player B chooses the rectangle with a single one at position (1, 3), so the new matrix becomes
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 1
Step 3: Player A chooses the rectangle with a single one at position (4, 4), so the new matrix becomes
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
Step 4: Player B cannot move, hence A wins the game.
Input :
0 0 1 0
0 0 0 0
0 0 0 0
0 0 0 1
Output : B
方法:该问题可以使用 sprague-grundy 定理解决。 Sprague-Grundy 的基本情况是 Grundy[0] = 0,即矩阵中的所有位置都填充为 0,然后 B 获胜,因此为 0。在 grundy 中,我们递归地将所有状态称为 grundy函数可能的。
4×4 矩阵可以表示为一个二进制的 16 位数字,在 int 中为 65535,其中每一位代表矩阵中的位置。下面是解决上述问题的步骤。
- 将矩阵转换为 int val。
- 使用 val 调用递归函数,使用记忆生成 grundy 值。
- 在递归函数内部,可以通过生成所有可能的矩形(使用四个 for 循环)来访问所有 grundy 状态。
- 检查生成的矩形,如果它是矩阵的矩形。那么这是grundy要访问的状态。
- 要使用 MEX 获得 Grundy 值,请参阅此内容。
- 如果递归返回 0,则玩家 B 获胜,否则玩家 A 获胜。
下面是上述方法的实现
时间复杂度:
在)
辅助空间: O(N)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。