背景
Nonogram,也称为Picross或Griddlers,是一个难题,其目标是使用每行上连续的彩色单元格的数量来确定2D网格上的每个单元格是彩色还是空白。
以下是带有解决方案的示例非图拼图。
问题是,某些商业Nonogram游戏/移动应用程序具有无法用手解决的难题(例如,具有多种解决方案,或者需要深度回溯)。但是,它们也为玩家提供了一些生命,当您尝试给正确答案为空白的单元格上色时,将会失去生命。因此,现在是时候对那些令人讨厌的“难题”进行暴力破解了!
为了简化任务,想象一下只有一条线索及其线索:
3 7 | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
这些[3,7]
是线索,行长为15个单元格。由于它有多种可能的解决方案,因此我们需要冒一些生命危险才能完全解决此问题(即确定所有有色单元格)。
挑战
给定一条具有线索的行(正整数列表)和行长,假设您使用最佳策略对这条行进行暴力破解,找出将要失去的最大生命数。
请注意,您总是会猜到有色单元格。在实际的游戏中,猜测空单元(对还是错)对您的生活没有影响,因此您无法以这种方式“解决”难题。
另外,您可以假设输入始终代表有效的Nonogram行,因此您无需担心诸如的问题[6], 5
。
说明
首先让我们看一些简单的例子。
[1,2], 5
此行完全有三种可能性(O
一个彩色单元格,.
一个空单元格):
O . O O .
O . . O O
. O . O O
如果我们尝试为单元格0(从左开始的基于0的索引)着色,则会发生以下情况之一:
- 单元格已正确着色。现在,我们有两种可能性,我们可以在单元2和单元4之间进行选择,以完全求解直线。无论哪种情况,在最坏的情况下我们都会丧生。
- 牢房是空的,我们失去了生命。在这种情况下,我们已经确定了这条线的唯一解决方案,因此我们只损失了1条生命。
因此,答案[1,2], 5
是1。
[5], 10
二进制搜索?不。
最明显的第一选择是4或5,这将显示一个空白的可能性(以1个生命为代价)。假设我们先选择了4个。如果单元格4确实是彩色的,则将其向左扩展,即尝试3、2、1和0直到失去生命(或者单元格0带有颜色,那么我们最终将完全没有生命)。每当失去生命时,我们都可以唯一地确定解决方案,例如,如果我们看到这样的情况:
_ _ X O O _ _ _ _ _
那么我们已经知道答案是这样的:
. . . O O O O O . .
因此,答案[5], 10
也是1。
[3,7], 15
从单元格11开始,如果为空,将立即显示以下解决方案。
O O O . O O O O O O O X . . .
然后尝试12,如果为空,则有两种可能,但要花1个额外的时间才能解决。
O O O . . O O O O O O O X . .
. O O O . O O O O O O O X . .
现在尝试2。如果为空,将导致三种可能性,可以与[1,2], 5
示例类似地解决。
. . X O O O . O O O O O O O .
. . X O O O . . O O O O O O O
. . X . O O O . O O O O O O O
如果您以这种方式将风险最小化,则可以以最大 花了2个生命。
测试用例
[1,2] 5 => 1
[2] 5 => 2
[1] 5 => 4
[] 5 => 0
[5] 10 => 1
[2,1,5] 10 => 0
[2,4] 10 => 2
[6] 15 => 2
[5] 15 => 2
[4] 15 => 3
[3,7] 15 => 2
[3,4] 15 => 3
[2,2,4] 15 => 4
[1,1,1,1,1,1,1] 15 => 2
[2,1,1,3,1] 15 => 3
[1,1,1,2,1] 15 => 5
对于后两种情况,最佳策略不是经过最小的空白,而是从左到右(或从右到左)。感谢@crashoz指出这一点。
规则
适用标准代码高尔夫球规则。有效提交的最短字节数为准。
赏金
如果有人提出多项式时间算法(带有正确性证明),我将奖励+100赏金给这种解决方案。
[6], 5
什么?