你如何代表魔方:

如果你正在开发软件来解决魔方问题,你将如何表示魔方?

这个ACM论文描述了它用来表示魔方的几种替代方法,并将它们与对方进行比较。 可悲的是,我没有一个帐户来获取全文,但描述如下:

提出并比较了魔方的七种替代表示forms:3乘3乘3的整数数组; 一个6×3×3的文字排列; 一个5乘12的文字matrix; 一个ll-ll-ll稀疏文字matrix; 一个54元素的向量; 一个4维数组; 和一个3×3×3的嵌套数组。 APLfunction用于定位移动和四分之一转加上几个有用的工具来解决立方体。

另外,这个RubiksCube.java文件包含一个非常干净的表示以及用于旋转部分的相关代码(如果您正在查找实际的代码)。 它使用一个单元格和faces数组。

一种方法是专注于视觉外观。

立方体有六个面,每个面是一个三乘三的正方形arrays。 所以

Color[][][] rubik = new Color[6][3][3]; 

那么每一个动作都是一种方法,可以排列一组特定的彩色方块。

Eschew优化; 使其面向对象。 我使用的伪代码类大纲是:

 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 

所使用的内存量非常小,处理量非常小,以至于不必进行优化,特别是在牺牲代码可用性的情况下。

表示立方体的一个有趣方法是由“Cube Explorer”软件使用的。 使用很多聪明的math方法可以用5个整数来表示立方体。 作者在他的网站上解释了他的计划背后的math。 根据作者,该表示适合于实现快速求解器。

有很多方法可以做到这一点。 有些方法比其他方法更有效地利用内存。

我已经看到人们使用长方体对象的3 x 3 x 3数组,立方体对象需要存储颜色信息(是的,该中心对象从来没有使用过)。 我见过有人使用6个数组,每个数组都是一个3×3的长方体数组。 我看过一个3×18的立方体arrays。 有很多可能性。

可能更大的关注是如何表示各种变换。 旋转物理立方体的单个面(所有立方体移动基本上是单个面的旋转)必须通过交换大量立方体对象来表示。

你的select应该适合你正在编写的任何应用程序。 这可能是你只渲染立方体。 这可能是没有用户界面。 你可能正在解决魔方。

我会select3×18arrays。

有20个重要的事情。 所以做一个方法是20个string的数组。 string将保存2或3个字符指示颜色。 任何一个动作都会影响7个小方块。 所以你只需要为六方中的每一方devise一个重映射器。

注意:此解决scheme无法记住白色中心上的徽标标签的方向。

顺便说一句,我帮助某人在15年前做了一次软件魔方,但我不记得我们是如何performance它的。

您可以将立方体想象为三个垂直的圆形链表,它们与三个水平链表相交。

只要旋转某个立方体的某一行,就可以旋转相应的指针。

它看起来像这样:

 struct cubeLinkedListNode { cubedLinkedListNode* nextVertical; cubedLinkedListNode* lastVertical; cubedLinkedListNode* nextHorizontal; cubedLinkedListNode* lastHorizontal; enum color; } 

你可能并不需要2'最后'的指针。

[我是用C做的,但是可以用Java或者C#来完成,只需要使用一个简单的类来实现cubeLinkedListNode,每个类都保存对其他节点的引用。 ]

请记住,有六个互锁的循环链表。 3垂直3水平。

对于每次旋转,您只需循环通过相应的循环链表,即顺序移动旋转圆的链接以及连接圆。

类似的东西,至less…

其他人很好地描述了物理立方体,但是关于立方体的状态…我会尝试使用vector变换的数组来描述立方体的变化。 这样,你可以保持rubiks立方体的历史作出改变。 我想知道是否可以将vector乘以一个变换matrix来find最简单的解决scheme?

作为可移动的48个面孔的排列。 基本的旋转也是排列,排列可以组成,它们组成一个组。

在一个程序中,这样的排列可以由包含数字0到47的48个元素的数组表示。对应于这些数字的颜色是固定的,因此可以从排列中计算视觉表示,反之亦然。