假设有一个 1 和 0 的 2D 网格,例如 -
0 1 0 0
0 0 1 0
0 0 0 1
1 0 0 0
网格被“折叠”以形成一个少 1 行和 1 列的较小网格,因此上述示例将“折叠”以形成 3 行和 3 列的网格。
新值由以下规则确定 -
new_grid[i][j] is dependent on
i) old_grid[i][j],
ii) old_grid[i][j+1],
iii) old_grid[i+1][j]
iv) old_grid[i+1][j+1]
If exactly one of the above values are 1, then new_grid[i][j] will be 1, else 0.
所以对于示例网格, out of [0][0], [0][1], [1][0] and [1][1]
, only [0][1]
is 1
,所以[0][0]
在新网格中将为 1。类似地, out of [0][1], [0][2], [1][1] and [1][2]
, both [0][1] and [1][2]
are 1
,所以[0][1]
innew_grid
将为 0。
输入以值的形式给出new_grid
。我必须找出可能的配置数量old_grid
,这new_grid
可以通过提供的折叠规则来实现。
我的方法
我目前想到的回溯解决方案是这样的——
为旧网格中的每个 1 值单元格识别假想的 2X2 框,这将对应于新网格中的适当单元格。
所有这些盒子都将包含一个值为 1 的单元格,因此将 1 放入每个盒子的随机单元格中。
递归检查在随机单元格中放置 1 是否确保每个框仍然恰好保留一个值为 1 的单元格。
如果最终获得了一个网格配置,其中每个框恰好包含一个值为 1 的单元格,请检查该配置是否可以“折叠”以获取新网格。
如果不是,则使用值为 1 的不同单元格重复该过程。
如果旧网格中有一些不属于任何“框”的单元格,那么它们就是我所说的“无关紧要”单元格。
例如 -
1 1
0 0
对于上述new_grid
情况,old_grid
可以是 -
1 0 1
0 0 0
0 0 0
或者
1 0 1
0 0 0
1 1 1
最后一行的单元格是“无关紧要”的单元格,因为它们不属于任何 2X2 框,并且它们都可以是1
s 或0
s 是有效的配置(我认为这是我们可以灵活操作它们的程度,虽然我不确定)。
我的问题是——这个算法很可能是指数级增长的,说50X10
.
有没有其他方法可以解决这个问题?或者是否有任何聪明的算法不通过所有可能的配置来计算它们?