Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 蛇立方拼图的正确性_Algorithm - Fatal编程技术网

Algorithm 蛇立方拼图的正确性

Algorithm 蛇立方拼图的正确性,algorithm,Algorithm,TrialPay发布在他们的博客上 最近,我们的一位工程师向我们介绍了蛇立方。蛇形立方体是一个由一系列立方体组成的拼图,由穿过每个立方体的弹性带连接。每个立方体可以围绕弹性带旋转360°,允许根据链的初始构造方式构建各种结构,最终目标是以这种方式排列立方体以创建立方体 例如: 这种特殊的排列包含17组小隔间,由8组两个小隔间和9组三个小隔间组成。这种排列可以用多种方式表示,但在本练习中,让“0”表示旋转不会改变拼图方向的块,或者可以被视为“直”块,而“1”表示旋转会改变拼图配置的块,或者“弯曲

TrialPay发布在他们的博客上

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

例如:

这种特殊的排列包含17组小隔间,由8组两个小隔间和9组三个小隔间组成。这种排列可以用多种方式表示,但在本练习中,让“0”表示旋转不会改变拼图方向的块,或者可以被视为“直”块,而“1”表示旋转会改变拼图配置的块,或者“弯曲”蛇。使用该模式,上面的蛇之谜可以描述为001110111010111101010100

挑战:

您面临的挑战是用您选择的任何语言编写一个程序,该程序以立方体尺寸(X、Y、Z)和二进制字符串作为输入,如果可以解决难题,则输出“1”(不带引号),即在给定立方体方向的情况下构造一个适当的XYZ立方体,如果当前排列无法解决,则输出“0”

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

  • TrialPay博客中的snake cube示例与Wikipedia的snake cube页面和www.mathematische-basteleien.de上的图片具有相同的组合
  • 手动将图像转换为字符串非常繁琐
  • 我试着制作一个能够大量组合的程序:

    #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
    
    #我们应该从16777216(00100…)的二进制表示开始,因为
    #较小的数字有两个以上的连续0(000111…)
    i=16777216
    已解决=[]
    
    而iTL;DR:这不是一个编程问题,而是一个数学问题。你可能会得到更好的服务

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

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

    不幸的是(或者不是,取决于你的品味),你要找的不是一个程序,而是一个数学证明

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

    其他时候,在状态配置之间导航可以被重新表述为优化实用程序功能。证明关于被优化空间的事情(比如它只有一个极值)可以转化为程序正确性的证明

    第二种方法中的状态配置可能是蛇形方向,也可能是一些更深层次的结构。例如,解决魔方的一般策略 通常不在文本多维数据集状态上声明,而是在的表达式上声明。这就是我个人期望你的解决方案最终会发挥的作用


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

    我认为您关于不可能有三个连续0的断言是错误的。考虑这样的安排:

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

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

    001
      000
        101
    

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

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

    我用了这个

    你只需要对整个立方体进行递归搜索,检查可能的方向。如果您找到了一个,您可以停止并打印解决方案(我选择打印所有解决方案)

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


    很抱歉,我现在找不到任何代码。

    我不确定您关于不能有两个以上连续0的断言是否正确。对于这种特殊的安排可能是正确的,但对于一般情况不一定如此。@JimMischel不是吗?一个3x3x3立方体中有三个“0”吗?我认为你的符号是错误的,如果你在第一行取第三个
    0
    ,然后旋转它,你会改变方向,所以它应该是
    1
    。基本上,
    0
    是当多维数据集是
    [[[0][]
    1时