2012-03-01 43 views
8

我遇到了难题斜面在Ubuntu中。 我想通过试验和错误等如何解决这个难题逻辑上没有反复试验

逻辑,而不是解决这一难题的规则很简单:

  1. 我们必须填写所有的右侧或左侧倾斜的框。
  2. 接触数字的斜线数量必须等于该数字。
  3. 电路板不允许有回路。即斜面不能形成环。

困惑:

Question

自动解决的答案:

enter image description here

从哪里开始?

+0

当然,您需要一定量的试验和错误。你可以尽早排除一些选项,但我认为没有任何回溯就可以做到这一点。 – 2012-03-01 17:27:47

+1

@EAGER_STUDENT:我认为你的意思是[这个游戏](http://manpages.ubuntu.com/manpages/lucid/man6/slant.6.html)?你不能看看源代码,看看他们如何解决它? – James 2012-03-01 17:31:29

+0

@AakashM是的,我可以在逻辑上解决简单的网格。在简单的网格中,角落处会有数字0或4或1。有了这个我将解决的工具。当宽度或高度增加时,问题是这三种情况在较难拼图中不存在。 – 2012-03-01 17:36:59

回答

2

而不是左右倾斜,我会使用斜杠(/)和反斜杠(\)。

让我们带一个带角(x1)(11)的正方形,其中x不等于1.左上角有一个这样的正方形。假设在该广场上的斜线是斜线,它连接两个1。那些1被“用完”,所有触摸他们的方格都必须有不接触数字的线条。但是这导致了不可能的情况,因为我们在左右两边都会有一个斜线,这意味着剩下的一个正在触及两个斜线。结论:如果你有一个有三个1的正方形,那么这个正方形的线必须触及不是1的拐角。此规则可能不适用于边缘和角落,但如果角落中有1,则必须画出接触该角落的线条。

数字1和3是对称的,并使用类似的逻辑,我们得到另一个规则:,如果你有三个3的然后在广场行方必须在触控那三个3的的。

有更多的一般规则,但它们不适用于角落。问题广场周围必须有广场。我们采取一个正方形两个相反的1(x1)(1y),其中x和y是任何东西,包括一个无号码。左下角有一个这样的两个方格。假设在该广场上的斜线是斜线,它连接两个1。那些1被“用完”,所有触摸他们的方格都必须有不接触数字的线条。但是,这会导致围绕1的循环。结论:如果你有一个正方形有两个相反的1,那么这个正方形中的那条线不能碰到这两个1的。此规则可能不适用于电路板边缘。

数字1和3是对称的,但以前的规则采用“无循环”规则,并且没有对称的“无侧线循环”规则,因此没有规则具有两个相反的3。

现在你知道哪一行触及1,你可以得出结论,没有其他行可以触摸它。我们可以将这个推理概括为以下填充规则:如果数字x触及x行,则所有其他相邻的正方形都有不触及数字的行。并对称:如果数字x是(4-x)正方形的线条不接触数字,那么所有其他相邻正方形必须有触摸数字的线条。

谷歌搜索术语“Gokigen Naname”我发现了更多规则。一个是大约两个相邻的1(11),但Mweerden已经覆盖了它。

这些规则不足以解决董事会。还有其他规则可能。但最终算法可能需要猜测。

+0

我不相信,在任何好的谜题中,算法都必须猜测(根据合理数量的经验,从Simon Tatham的便携式益智收集中挑选版本 - http://www.chiark.greenend.org.uk/~sgtatham/puzzles/java/slant.html),否则我同意。它的一切都是为了找到给你提供信息的模式,然后再添加它,然后找到更多的模式。如果你正在猜测,那么你还没有足够的模式。 :) – Chris 2012-03-02 10:58:20

+0

模式的数量可能非常大,以至于猜测比拥有千兆字节的大型数据库要好。 – Dialecticus 2012-03-02 11:06:14

+0

你是对的,有时候只是测试失败的路径可能是最好的,但我的直觉/经验表明,情况并非如此。自从我上次上场以来,它已经太久了,所以我不记得我脑海中所有使用和放下的规则。如果我不在工作,我会开始提醒自己。 ;-) – Chris 2012-03-02 11:15:25

2

“逻辑上”是一个非常广泛的术语。正如Orbling在评论中提到的那样,回溯可以被认为是合乎逻辑的。人们也可以将“逻辑上”理解为如何通过将其转化为逻辑公式来解决它。从我收集的评论中,您正试图实现一个求解器,类似于一个常见的数独解算器。

一个简单的方法来实现一个求解器,类似于Sudokus的求解器,是找到某些模式。对于您提到的程序所产生的谜题,我可以合理地相信,这应该足以解决它们,而无需猜测和回溯。

一些明显图案的例子是<11>>33<。特别是2有一些很好的“传递”属性。例如:<12...23 -> <12...23<(具有2 ... 2任意数量的2)。尝试解决各种例子,当它陷入困境时,我相信你找到了一个可以教你另一种模式的例子。