如果您正在开发解决Rubik's Cube的软件,您将如何表示立方体?
本ACM论文描述了几种用于表示魔方的立方体并将它们与彼此进行比较的替代方法.可悲的是,我没有帐号来获取全文,但说明中说明:
提出并比较了Rubik's Cube的七种替代表示:3乘3乘3的3位数整数; 一个6乘3乘3的文字阵列; 一个5乘12的字面矩阵; 一个ll-by-ll稀疏文字矩阵; 一个54元素的向量; 一个四维数组; 和一个3乘3乘3的嵌套数组.APL功能用于定向移动和四分之一圈以及几个用于解决立方体的有用工具.
此外,这个RubiksCube.java文件包含一个非常干净的表示以及旋转部分的相关代码(如果您正在寻找实际代码).它使用一个单元格和面数组.
避免优化; 使其面向对象.我使用的伪代码类大纲是:
class Square + name : string + accronym : string class Row + left_square : square + center_square : square + right_square : square class Face + top_row : list of 3 square + center_row : list of 3 square + bottom_row : list of 3 square + rotate(counter_clockwise : boolean) : nothing class Cube + back_face : face + left_face : face + top_face : face + right_face : face + front_face : face + bottom_face : face - rotate_face(cube_face : face, counter_clockwise : boolean) : nothing
使用的内存量非常小,处理量非常小,以至于完全没有必要进行优化,尤其是在牺牲代码可用性时.
一种方法是专注于视觉外观.
一个立方体有六个面,每个面是一个三乘三的正方形阵列.所以
Color[][][] rubik = new Color[6][3][3];
然后每次移动都是一种置换一组特定彩色方块的方法.
软件"Cube Explorer"使用了一种表示立方体的有趣方法.使用大量聪明的数学方法,该方法只能使用5个整数来表示多维数据集.作者在他的网站上解释了他的计划背后的数学.根据作者的说法,该表示适合于实现快速求解器.
有很多方法可以做到这一点。有些方法比其他方法更有效地利用内存。
我见过人们使用3 x 3 x 3的长方体数组,长方体对象需要存储颜色信息(是的,从未使用过中心对象)。我见过人们使用6个数组,每个数组都是3 x 3的长方体数组。我看过3 x 18的长方体阵列。有很多可能性。
可能更大的问题是如何表示各种转换。旋转一个物理立方体的一个面(所有立方体的移动本质上都是一个面的旋转)必须通过围绕许多长方体对象进行交换来表示。
您的选择应该对您正在编写的任何应用程序都有意义。可能是您仅在渲染多维数据集。可能是没有UI。您可能正在解决多维数据集。
我会选择3 x 18阵列。