蛇立方体拼图正确性

时间:2012-07-23 23:36:52

标签: algorithm

TrialPay在他们的博客上发布了a programming question about a snake cube puzzle

  

最近,我们的一位工程师向我们介绍了蛇形立方体。蛇形立方体是由一系列立方体组成的拼图,通过贯穿每个立方体的弹性带连接。每个立方体可围绕弹性带旋转360°,允许根据链条最初构造的方式构建各种结构,最终目标是以创建立方体的方式排列立方体。

示例:

enter image description here

  

这种特殊的安排包含17组立方体,由8组两个立方体和9组三个立方体组成。这种安排可以用各种方式表达,但是为了本练习的目的,让'0'表示旋转不会改变拼图方向的棋子,或者可以被认为是“直”棋子,而'1'将表示旋转改变拼图配置或“弯曲”蛇的碎片。使用该模式,上面的蛇形拼图可以描述为001110110111010111101010100。

挑战:

  

您面临的挑战是编写一个程序,使用您选择的任何语言,将多维数据集维度(X,Y,Z)和二进制字符串作为输入,并在可能的情况下输出“1”(不带引号)解决这个难题,即在给定立方体方向的情况下构造一个合适的X Y Z立方体,如果当前的排列无法解决则构造为“0”。

我发布了solution的半详细解释,但如何确定program是否解决了问题?我想到了更多的测试用例,但我遇到了一些问题:

  1. 来自TrialPay博客的蛇形立方体示例与维基百科的Snake Cube页面和www.mathematische-basteleien.de上的图片具有相同的组合。
  2. 手动将图像转换为字符串非常繁琐。
  3. 我试图制作一个可以制作很多组合的程序:

    #We should start at the binary representation of 16777216 (00100...), because
    #lesser numbers have more than 2 consecutive 0s (000111...)
    i = 16777216
    solved = []
    while i <= 2**27:
        s = str(bin(i))[2:]
        #Add 0s
        if len(s) < 27:
            s = '0'*(27-len(s)) + s
        #Check if there are more than 2 consecutive 0s
        print s
        if s.find("000") != -1:
            if snake_cube_solution(3, 3, 3, s) == 1:
                solved.append(s)
        i += 1
    

    但完成执行只需要永远。有没有更好的方法来验证程序?

    提前致谢!

3 个答案:

答案 0 :(得分:3)

TL; DR:这不是一个编程问题,而是一个数学问题。 math.stackexchange.com可能会为您提供更好的服务。

由于立方体大小和蛇长度作为输入传递,因此检查程序需要验证的输入空间基本上是无限的。即使检查解决方案的单个输入的答案是合理的,但在整个输入空间强制执行此检查显然不是。

如果您的解决方案在某些情况下失败,您的检查程序可以帮助您找到这些。然而,它无法确定您的程序的正确性:如果您的解决方案实际上是正确的,那么检查程序将永远运行并让您感到疑惑。

不幸的是(或不是,取决于您的口味),您所寻找的不是程序,而是数学证明

(证明)算法正确性本身就是一个完整的研究领域,你可以花很长时间在其中。也就是说,proof by induction通常是适用的(特别是对于递归算法。)

其他时候,可以将状态配置之间的导航重新设置为优化效用函数。证明正在优化的空间(例如它只有一个极值)可以转化为程序正确性的证明。

您在第二种方法中的状态配置可能是蛇形方向,或者它们可能是更深层次的结构。例如,解决Rubik立方体的一般策略 通常不在文字立方体状态上声明,而是在group of relevant symmetries的表达式上声明。这是我个人希望你的解决方案最终能够发挥作用的。

编辑:多年以后,我觉得我应该指出,对于给定的,固定的立方体大小和蛇的长度,当然搜索空间实际上是有限的。您可以编写一个程序来强制检查所有组合。如果你聪明,你甚至可以争辩说检查一组案例的时间可以被视为一组独立的随机变量。从这里你可以建立一个合理的进度条来估计你的等待时间(非常)。

答案 1 :(得分:0)

我认为你断言不能有三个连续的0是错误的。考虑这种安排:

000
  100
    101
      100
        100
          101
            100
              100
                100

我遇到这个难题的一个问题是符号。 1表示立方体可以改变拼图的方向,但是哪个轴?在上面的例子中,假设Y轴是垂直的而X轴是水平的。左侧的1表示围绕立方体的Y轴旋转的能力,右侧的1表示围绕立方体的X轴旋转的能力。

我认为可以构建一个类似于上面的安排,但有三个000组。但是我没有它的符号。显然,可以修改上面的示例,以便前三行是:

001
  000
    101

第一段的1表示绕Y轴的旋转。

答案 2 :(得分:0)

我不久前为同一个问题编写了一个Java应用程序。

我使用了backtracking algorithm

您只需要在整个多维数据集中进行递归搜索,检查可能的方向。如果您找到了解决方案,则可以停止并打印解决方案(我选择打印出所有解决方案)。

对于3x3x3立方体,我的程序在一秒钟内解决了它们,对于较大的立方体,它需要大约5秒钟到15分钟。

抱歉,我现在无法找到任何代码。

相关问题