Algorithm 蛇立方拼图的正确性
TrialPay发布在他们的博客上 最近,我们的一位工程师向我们介绍了蛇立方。蛇形立方体是一个由一系列立方体组成的拼图,由穿过每个立方体的弹性带连接。每个立方体可以围绕弹性带旋转360°,允许根据链的初始构造方式构建各种结构,最终目标是以这种方式排列立方体以创建立方体 例如: 这种特殊的排列包含17组小隔间,由8组两个小隔间和9组三个小隔间组成。这种排列可以用多种方式表示,但在本练习中,让“0”表示旋转不会改变拼图方向的块,或者可以被视为“直”块,而“1”表示旋转会改变拼图配置的块,或者“弯曲”蛇。使用该模式,上面的蛇之谜可以描述为001110111010111101010100 挑战: 您面临的挑战是用您选择的任何语言编写一个程序,该程序以立方体尺寸(X、Y、Z)和二进制字符串作为输入,如果可以解决难题,则输出“1”(不带引号),即在给定立方体方向的情况下构造一个适当的XYZ立方体,如果当前排列无法解决,则输出“0” 我发布了一个关于的半详细的解释,但是我如何确定它是否解决了问题?我想得到更多的测试用例,但遇到了一些问题:Algorithm 蛇立方拼图的正确性,algorithm,Algorithm,TrialPay发布在他们的博客上 最近,我们的一位工程师向我们介绍了蛇立方。蛇形立方体是一个由一系列立方体组成的拼图,由穿过每个立方体的弹性带连接。每个立方体可以围绕弹性带旋转360°,允许根据链的初始构造方式构建各种结构,最终目标是以这种方式排列立方体以创建立方体 例如: 这种特殊的排列包含17组小隔间,由8组两个小隔间和9组三个小隔间组成。这种排列可以用多种方式表示,但在本练习中,让“0”表示旋转不会改变拼图方向的块,或者可以被视为“直”块,而“1”表示旋转会改变拼图配置的块,或者“弯曲
#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时