解决非图(绘图方块)

2024-01-05

今天是星期五下午,让我们来解决一个有趣的谜题/算法问题。

我最喜欢的任天堂 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

是的,这个问题是 NP 完全的,但这仅仅意味着随着谜题规模的增大,你(几乎)会陷入指数增长的运行时间。但在现实生活中,拼图的大小不会增加。几乎没有人愿意构建大于 100x100 的谜题,绝大多数都小于 50x50。构建一个能够在几分之一秒内解决书籍和杂志上发布的 95% 谜题的解算器实际上并不是特别具有挑战性。一个相当简单的深度优先搜索系统就可以做到这一点。

不太明显的是,有一小部分谜题非常棘手,会导致大多数简单求解器的运行时间爆炸。其中大多数都是设计糟糕的谜题,人类也很难或不可能解决,但有些是特别聪明的谜题,经验丰富的人类解谜者可以轻松解决,使用比大多数人工智能程序更深入的洞察力。

我自己编写了一个求解器,可以非常快速地解决大多数谜题,并且我已经做了一个对许多其他求解器的调查 http://webpbn.com/survey/与基准结果比较它们的性能。我还讨论了一类有趣的难题(多米诺难题),它演示了一些对于聪明人来说并不困难的难题对于大多数程序来说却非常困难。调查中可以找到我的求解器和多米诺拼图的链接。

我认为还有很大的改进空间,并会鼓励有新想法的人尝试一下。但值得注意的是,显而易见的事情已经做了,再做也没有多大用处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决非图(绘图方块) 的相关文章

  • 图算法:邻接图的可达性

    我有一个依赖图 我将其表示为Map
  • 以最少插入次数将字符串转换为回文

    这是一个来自日常编码问题 https www dailycodingproblem com 给定一个字符串 找到可以通过插入来组成的回文数 单词中任何位置的字符数尽可能少 如果有 大于一个可以制作的最小长度的回文 返回 字典顺序最早的一个
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • 最小硬币找零问题——回溯

    我正在尝试用最少数量的硬币解决硬币找零问题 采用回溯法 我实际上已经完成了它 但我想添加一些选项 按其单位打印硬币数量 而不仅仅是总数 这是我下面的Python代码 def minimum coins coin list change mi
  • 如何反向for循环?

    我正在制作一个水模拟程序 我需要它通过 y x 进行 for 循环 但我需要它先检查最底部的 y 然后向上检查 这是我的等级 lvl 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 我需要
  • 如何从单链表的末尾找到第n个元素?

    以下函数试图找到nth to last单链表的元素 例如 如果元素是8 gt 10 gt 5 gt 7 gt 2 gt 1 gt 5 gt 4 gt 10 gt 10那么结果是7th到最后一个节点是7 任何人都可以帮助我了解这段代码是如何工
  • 什么是日历队列?

    我正在致力于构建一个离散事件模拟器 维基百科提到有几种通用优先级队列非常适合在 DES 中使用 具体来说 它提到日历队列是一个很好的结构 我找到了一份 pdf 1988 年的 其中提到了日历队列 但在大多数情况下我找不到关于它们的任何其他内
  • Lamport 的 Paxos 中的矛盾做了简单的论文

    阶段 2 a 如果提议者收到大多数接受者对其准备请求 编号为 n 的响应 则它向每个接受者发送一个接受请求 以获取编号为 n 且值为 v 的提案 其中 v 是响应中编号最高的提案的值 或者如果响应未报告任何提案 则为任意值 正如论文中提到的
  • 将平面表解析为树的最有效/优雅的方法是什么?

    假设您有一个存储有序树层次结构的平面表 Id Name ParentId Order 1 Node 1 0 10 2 Node 1 1 1 10 3 Node 2 0 20 4 Node 1 1 1 2 10 5 Node 2 1 3 10
  • Java 服务器和浏览器客户端之间乐观对象复制的解决方案?

    我正在构建一个系统 多个用户需要同时创建 查看和修改一组对象 该系统计划在 Java 服务器和现代浏览器客户端上运行 我可以选择哪些 它需要在网络和服务器中断时具有鲁棒性 用户界面不得阻止修改 修改需要存储在本地并在连接恢复时发布 在正常操
  • 使用 O(1) 辅助空间迭代二叉树

    是否可以在 O 1 辅助空间中迭代二叉树 不使用堆栈 队列等 或者这已被证明是不可能的 如果可以的话 怎样才能做到呢 编辑 我得到的关于如果有指向父节点的指针就可能实现这一点的响应很有趣 我不知道可以做到这一点 但取决于您如何看待它 这可以
  • Deflate 压缩 - 数值示例

    我真的很想看看一个数字示例 手动压缩如何进行压缩 以下非常短的文本 abc 已使用 deflate 算法进行压缩 输出 eJxLTEoGAAJNASc 其二进制表示法为 01100101 01001010 01111000 01001100
  • 递归分层父子

    我有一个来自数据库的项目集合 该数据库具有parentid值或空 这是我的班级设计 public class Item public int id get set public string Name get set public int
  • 如何编写一个简单的版本控制系统?

    我想做一个简单的版本控制系统 但我不知道如何构建我的数据和代码 这是一个简短的例子 用户登录 User has two options when uploading a file 提交新文件 提交文件的新版本 用户应该能够看到树 版本不同
  • 多线程归并排序,添加额外的线程

    我在java中的多线程合并排序算法中面临一个问题 我应该将代码修改为 3 4 5 6 7 8 线程合并排序 将原始数组划分为subArrays 目前它有2subArrays 如何将原始数组拆分为 3 4 5 6 7 8subArray是为了
  • 哪种算法可以解决我的婚礼餐桌问题?

    我的婚礼有 x 位客人 有 y 张桌子 有 z 个座位 客人A可以与客人B同桌 客人C不能与客人D同桌 给定所有客人之间所有连接的数据集 是否有已知的算法可以解决此类问题 我确信这种问题有一个抽象的父问题 称为 问题 x 或其他问题 或者它
  • 如何使用 C 中的 Banker's Rounding 将 double 舍入为 int

    我想编写一个函数 使用银行家的舍入方法将双精度数舍入为整数 将一半舍入为偶数 http en wikipedia org wiki Rounding Round half to even http en wikipedia org wiki
  • 高效找到圆和网格的交点

    找到由圆心和半径定义的圆与任意网格的交点的好方法是什么 An illustration of the points I am trying to find 到目前为止我想到的可能的解决方案 找到位于中心 半径之间的所有线 对于每条线计算交点
  • 将 diff 转换为带有删除线的 Markdown?

    我想转换输出diff 在 Markdown 文件上 降价与
  • 如何有效地从连续字符串中提取文字单词? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将没有空格的文本拆分为单词列表 https stackoverflow com questions 8870261 how to split text without spaces into li

随机推荐

  • 下载 Laravel 时 Composer 非常慢

    你能帮我吗 我想通过以下方式安装 Laravelcomposer create project laravel laravel进入cms目录 但 Composer 下载它非常非常慢 你能帮我看看如何增强它吗 这是我的终端 saidalo S
  • Bootstrap Datetimepicker设置日期

    我正在使用一个日期时间选择器 http eonasdan github io bootstrap datetimepicker 来自 Eonasdan 到目前为止效果很好 我有一个像这样的 HTML 元素 div div 并使用 datet
  • Win32 (GDI) - 设置静态控件的不透明度

    我正在使用 C 无 MFC 或 GDI 我想要的是将子窗口的不透明度设置为 100 我的子窗口是STATIC控制 我想知道这是否可能 如果可以 有人可以指出我如何做到这一点的正确方向 这是我的设置 我创建我的父窗口如下 HWND hWnd
  • 有没有办法在远程主机上运行 Selenium 测试?

    我想运行以下设置 on host 1 执行一些 Selenium 测试 on host 2 运行火狐浏览器 On host 1将有一个 Jenkins 实例运行测试并且host 2将是一个运行在上面的 Docker 容器host 1 并且
  • 折叠卡打开然后立即再次关闭

    我读过以前的帖子 讨论了导航栏和菜单的这个问题 但它似乎并不适用 我有一个非常简单的例子 两张卡 一张默认打开 另一张折叠 当我尝试按卡 2 按钮展开第二张卡时 它会打开 但随后立即再次关闭 我不确定我做错了什么 这里的例子 div div
  • PHP:反洪水/垃圾邮件系统

    我实际上正在开发一个 PHP 项目 该项目将具有用户系统 登录 注册 将丢失的密码发送到电子邮件 我认为这可能非常容易受到暴力攻击和 或垃圾邮件 发送某人电子邮件的密码 例如 1000 次等 请使用您的幻想 当今的网络服务器 Apache
  • HtmlAgilityPack 获取页面标题和 H1 标签

    嘿 我正在尝试通过执行以下操作从网页获取页面标题和 H1 标签 doc LoadHtml htmlSourceCode txtTitle Text doc GetElementsByTagName title InnerText txtH1
  • IExpando 是什么以及它在哪里使用?

    我正在使用反射器浏览 mscorlib 中的类型 就像你一样 并遇到了IExpando接口 http msdn microsoft com en us library system runtime interopservices expan
  • Swift:在 switch 语句中测试类类型

    在 Swift 中 您可以使用 is 检查对象的类类型 如何将其合并到 开关 块中 我认为这是不可能的 所以我想知道解决这个问题的最佳方法是什么 你绝对可以使用is in a switch堵塞 请参阅 Swift 编程语言中的 Any 和
  • 我应该定义默认构造函数吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 所以我们正在进行一些同行评审 这个小小的分歧出现了 即使默认构造函数什么也不做 是否应该定义它 还是应该让编译器定义它 到目前为止 双方都无法拿
  • 如何实现GMail中聊天窗口的弹出功能?

    我并不是在寻找完整的实施 我更感兴趣的是他们是如何做到的 我知道他们使用 GWT 但我想要一个更底层的答案 天真地 我会首先想到当您单击弹出链接时 他们只是打开一个新窗口并将内容复制到其中 有很多原因导致效果不佳 所以我想知道是否有人知道或
  • C++。为什么 std::cout << char + int 打印 int 值?

    比方说 我们有 char x a int y 1 所以 如果你运行 std cout lt lt x y 它打印 98 而不是 b 正如我所见here http www cplusplus com reference ostream ost
  • 有没有同时支持 Microsoft Office 和 Open Office 的 Java 库?

    Apache POI 支持 Microsoft Office JExcelApi 支持 Open Office 那么有没有同时支持 Microsoft Office 和 Open Office 的 Java 库呢 注 在pom xml在文件
  • R:从下对角线创建对称矩阵[重复]

    这个问题在这里已经有答案了 我有一个矩阵的下三角 我试图将其转换为 dissim 矩阵 因此它需要是对称的 print rdf X0 X1 X2 X3 X4 0 0 0000000 NA NA NA NA 1 0 5340909 0 000
  • 计算文本文件中单词列表的出现次数

    我有两个文本文件 File1 如下所示 apple dog cat File2 看起来像这样 appledogtree dog catapple apple00001 我想计算 File1 中的单词列表在 File2 中出现的次数 并得到如
  • Logstash 输出到 AWS EC2 上的 Elasticsearch

    我在配置 Logstash 以输出到 AWS EC2 上的 Elasticsearch 集群时遇到问题 我正在使用 Logstash 版本 1 1 5 和 Elasticsearch 1 19 8 这是我在logstash中的输出配置 ou
  • SQL 开发人员:为其他用户生成数据库文档

    我的数据库中有一个管理员用户 管理员用户可以访问所有数据库对象 我没有管理员用户的凭据 我的应用程序还具有普通用户 该用户对管理员用户的许多对象具有访问权限 选择 删除授权等 因此 在 SQL 开发人员中 当我使用普通用户创建连接时 我可以
  • 我可以在不创建临时数组的情况下移动 NSMutableArray 中的对象吗?

    我以为我已经拥有了 void shiftArray NSMutableArray mutableArray NSUInteger shift for NSUInteger i 0 i lt mutableArray count i NSUI
  • 如何增加 Android 应用程序的堆大小?

    我正在编写一个使用多个 3D 模型的 Android 应用程序 这种带有纹理的模型会占用大量内存 我发现制造商对应用程序可以使用的堆大小设置了限制 例如我的平板电脑三星 Galaxy Tab 8 9 P7310 可以占用 64MB 内存 有
  • 解决非图(绘图方块)

    今天是星期五下午 让我们来解决一个有趣的谜题 算法问题 我最喜欢的任天堂 DS 游戏之一是绘图方块 DS http en wikipedia org wiki Picross Ds 游戏非常简单 它涉及解决称为连线图 http en wik