今天是星期五下午,让我们来解决一个有趣的谜题/算法问题。
我最喜欢的任天堂 DS 游戏之一是绘图方块 DS http://en.wikipedia.org/wiki/Picross_Ds。游戏非常简单,它涉及解决称为连线图 http://en.wikipedia.org/wiki/Nonogram。您可以在这里尝试一个简单的在线 Picross 克隆:TylerK 的绘图方块 http://www.thetimmys.com/flash/picross/.
Nonograms 是一个网格,其中为网格的每一行和每一列定义了数字序列。这些数字定义了该行/列的“填充”方块块,但块两侧的未填充区域未定义。例如,如果您有一行如下所示:
(source: steam-punk.net http://steam-punk.net/images/picross1.jpg)
该行的可能解决方案包括:
(source: steam-punk.net http://steam-punk.net/images/picross2.jpg)
(source: steam-punk.net http://steam-punk.net/images/picross3.jpg)
etc.
“4 5”只是告诉您,在行中的某个位置,有 4 个连续的块被填充,然后是 5 个连续的块被填充。这些将是唯一被填充的块,并且它们之前/之后的空间量是没有定义的。
当所有行和列都满足其定义且没有任何矛盾时,拼图就完成了。
概念上非常简单的游戏,但手动解决其中一些问题可能需要相当长的时间。 Picross DS 的谜题逐渐增大到 25x20 网格,这通常需要我大约半个小时才能解决。
然而,我总是想到,编写一个程序来解决这个游戏是相当容易的。我从来没有抽出时间来做这件事,但也许这里的一些人会喜欢这个挑战。如果发布了相当数量的解决方案,我将在一个大的谜题上对它们进行基准测试,类似于保罗·贝甘蒂诺 (Paolo Bergantino) 在这里提出了他的令人困惑的问题 https://stackoverflow.com/questions/746082/how-to-find-list-of-possible-words-from-a-letter-matrix-boggle-solver。里面有相当多的信息Nonogram 维基百科页面 http://en.wikipedia.org/wiki/Nonogram#Solution_techniques关于解决谜题的方法,如果你想参考的话。
这是来自 TylerK's Picross 的 Puzzle #1 的易于解析的定义,因此您可以为程序提供一些东西。第 1 行是拼图尺寸(可能不必要),第 2 行是行定义,第 3 行是列定义。这只是我首先想到的,所以如果有人能想到更好的输入格式,请随意评论或编辑这篇文章以包含它。
15 15
15,4 5,2 4,1 3,2,2,2 4 3,2 6 2,2 1 6 2,2 1 1 4 2,1 1,1 3 2 1,2 2 1 2 1,3 3 2 1,9
4 4,3 1 2 3,2 1 2 2,2 1 1,1 4 2,1 3,1 8,1 3 1 1,1 4 2 1,1 4,2 4 3,3 3 3,4 1,10 3,10