简要题意:
给定一个 01 01 01 棋盘,每次可以翻转一个“十”字形(即一个格子连同它四方向的相邻格子,出界则不翻)。求在哪些格子上翻转(十字形的中心)可以使得 翻转后全 0 0 0 且 方案字典序最小 。
首先 n , m ≤ 15 n,m \leq 15 n,m≤15,本着面向数据范围做题的原理,分析算法。
算法一
枚举翻转哪些格子进行验证。
时间复杂度: O ( 2 n × m × n × m ) O(2^{n \times m} \times n \times m) O(2n×m×n×m),难以接受这样的爆炸性复杂度。
算法二
需要我们分析一下题目。
我们肯定无法枚举 n n n 行所有的翻转情况,但我们可以枚举 1 1 1 行。
-
什么?枚举 1 1 1 行?
-
没错,我们只枚举第 1 1 1 行是否翻转。
-
那么,其它行的怎么办呢?
-
其实很简单。你想:在 按照行的顺序枚举 的情况下,如果 a i − 1 , j = 0 a_{i-1,j} = 0 ai−1,j=0,那么 a i , j a_{i,j} ai,j