问题标签 [rubiks-cube]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
872 浏览

rubiks-cube - 如何创建用于解决魔方的模式数据库?

我正在尝试实现用于求解 3x3x3 魔方的Korf 算法。部分解决方案是创建模式数据库。

这是从论文中引用的,其中包含有关如何执行此操作的全部信息:

使用目标状态的广度优先搜索,我们可以枚举这些状态,并在表格中记录解决每个角块组合所需的移动次数。

你如何在代码中转换它?由于在每一步中,我们都有多个目标状态,我不清楚我们如何才能“枚举”所有可以从它到达的状态。

0 投票
0 回答
275 浏览

python - 用python编写的魔方计时器?

我是 cubing 的忠实粉丝,但我使用 Linux 并且找不到任何像样的计时器。我尝试在 python 3 中编写一个,但我已经好几年没有做过了,它一直在绘制随机错误。如果说键盘模块不存在。有人可以帮忙吗。

0 投票
1 回答
2756 浏览

c++ - A* 算法中魔方的启发式函数 人工智能

所以我试图通过使用 C++ 的不同算法来解决魔方。我已经尝试过迭代深化搜索 (IDS) 并且做对了,但现在我陷入了 A* 算法。我做了一些研究,发现立方体角落和边缘的 3D 曼哈顿距离是为 A* 开发启发式的方法之一,但我不知道它是如何编码的。你们能否帮助或指导我如何开发定义上可接受的功能?

我正在寻找可以帮助我摆脱这个困境的所有建议。谢谢。

0 投票
0 回答
202 浏览

c# - 如何操纵由 2D 数组表示的魔方的面以执行面旋转

我正在用 C# 创建一个解决魔方问题的项目。它将魔方的当前状态作为输入,并输出一系列动作以执行使用指定符号解魔方。

Cube 由 6 个长度为 9 的字符串数组组成:

我创建了一个 excel 电子表格来代表每个面孔二维立方体的表示

你可以把它想象成一个折叠在一起形成立方体的网。

由于我使用的是控制台应用程序而不是 Windows 窗体应用程序,因此我必须通过将每个面写入彼此下方的控制台来表示立方体。我使用以下方法执行此操作PrintCube()

这使得求解立方体的标准输出如下:

求解立方体输出

目前,我正处于编码可以在立方体上执行的每个不同动作的阶段,但我遇到了障碍。

下面是执行操作的代码:

我正在按顺序对操作进行编码,因此,到目前为止,我只完成了F操作,但我一生都无法弄清楚我在R操作上哪里出错了。

在魔方符号中,我们看到对已解出的立方体的操作R,从白色面朝外,蓝色面朝上,表示以下运动:

  • 握住立方体,白色面朝外,蓝色面朝上。

  • 将红色面顺时针旋转 90 度,使白色面的右侧移到蓝色面上,绿色移到白色上,黄色移到绿色上,蓝色移到黄色上。

执行这两个步骤会导致R操作。

要了解我们需要在代码中做什么才能实现这一点,让我们回到 excel 电子表格。 二维立方体的表示

从白边开始,我们可以看到我们必须改变:

  1. 白面的索引2、5和 8绿面的索引2、5 和 8 。
  2. 脸的索引2、5和 8 分别对应白脸的索引*2、5 和 8*
  3. 然而,当我们到达黄色面时,由于网络中的面必须“翻转”来连接橙色、蓝色、绿色和红色的面,我们必须更改索引0、3 和 6。这些分别更改为蓝色面上的索引 8、5和 2 。如果您面前有一个立方体,则更容易思考为什么这是真的
  4. 绿面上,我们将索引2、5 和 8更改为面上的索引 6、3和 0。同样,这是因为我们如何解释网络。

放大 Operation R的代码,我们可以看到我是如何实现这一点的:

我在每一行旁边都有注释,说明发生了变化,其中//258 630表示由newCubeState索引2、5 和 8表示的面部分别更改为由CubeState索引 6、3和 0表示的面部。

从上面的二维数组可以看出,第一个索引表示人脸变为[0] = "WHITE", [1] = "BLUE", [2] = "RED",[3] = "GREEN" , [4] = "橙色", [5] = "黄色"

知道了这一点,我们可以这样解释我的代码:

  • 首先,绿色面上的第 2 个索引成为黄色面上的第 6 个索引。[绿色 -> 黄色]

  • 二、黄脸第0个索引变成第8个索引[YELLOW -> BLUE]

  • 第三,脸的第二个索引变成白脸第二个索引。[蓝色 -> 白色]

  • 第四,白面的第二个索引变成了绿面的第二个索引。[白色-> 绿色]

请注意,由于某些奇怪的原因,即使它们是完全独立的变量,它似乎会影响CubeState[x,y]我设置的时间newCubeState[i,j] = CubeState[x, y],因此,我需要在更改之前使用索引,这导致需要临时变量tempString,但是,这不是手头的问题在这里。

  • 第五,绿面上的第 5 个索引变成了黄面上的第 3 个索引。[绿色 -> 黄色]

  • 六、黄面第3个索引变成第5个索引[YELLOW -> BLUE]

  • 第七,脸的第5个索引变成了白脸的第 5 个索引。[蓝色 -> 白色]

  • 第八,白面的第5个索引变成了绿面的第 5 个索引。[白色-> 绿色]

  • 第九,绿面上的第8 个索引变成了黄面上的第 0个索引。[绿色 -> 黄色]

  • 十、黄面第6个索引变成第2个索引[YELLOW -> BLUE]

  • 第十一,脸的第8个索引变成了白脸的第8个索引。[蓝色 -> 白色]

  • 第十二,白面的第8个索引变成了绿面的第 8 个索引。[白色-> 绿色]

这应该会产生以下输出:


白 - 白 - 绿

白 - 白 - 绿

白 - 白 - 绿  

 

蓝色 - 蓝色 - 白色

蓝色 - 蓝色 - 白色

蓝色 - 蓝色 - 白色  

 

红 - 红 - 红

红 - 红 - 红

红 - 红 - 红  

 

绿色 - 绿色 - 黄色

绿色 - 绿色 - 黄色

绿色 - 绿色 - 黄色  

 

橙色 - 橙色 - 橙色

橙色 - 橙色 - 橙色

橙色 - 橙色 - 橙色  

 

蓝色 - 黄色 - 黄色

蓝色 - 黄色 - 黄色

蓝色 - 黄色 - 黄色


但是,我们看到情况并非如此:

执行正确的操作

出于某种奇怪的原因,我们看到第3面的第 8 个索引( GREEN)变成了BLUE而不是YELLOW,以及第5面的第 6 个索引( YELLOW)变成了WHITE而不是BLUE

我不知道为什么会发生这种情况,我将非常感谢您的帮助。

它不应该引起任何问题,但这是我的RotateFaceRight()方法:

我的其余代码在这里:

立方体.cs

CubeCenters.cs

CubeOperations.cs

程序.cs

0 投票
1 回答
579 浏览

c# - C# 中用于魔方的 7-Riffle Shuffle 算法

对于学校作业,我们需要在 C# 中实现一个 7-Riffle 算法方法,它可以打乱魔方的面。不幸的是,网络上没有足够的资源来展示它应该如何编码。我已经实现了秒表来计算不同魔方大小所需的经过时间。

这段代码适用于洗牌位,但它所花费的时间似乎没有意义,因为它比 Fisher Yates 的更快。

请问有什么帮助吗?

0 投票
1 回答
257 浏览

javascript - 吉克立方体 api。从状态配置

我正在制作自己的 android 应用程序,可以帮助解决魔方问题。我买了小米的 Giiker Cube 并研究了 Herbert Kociemba 的两阶段算法。

所以问题从这里开始。对于 Giiker Cube,我查看了下面的 api。但是这个 api 给出了 20 字节数据的多维数据集的状态。 https://github.com/Vexu/SuperCube-API

我还从这里查看了相同的 React 库及其依赖库,以研究该状态到立方体面和移动的转换。但是那个库的解码逻辑对我不起作用。

我也没有使用本机反应。 https://www.npmjs.com/package/react-native-giiker

我需要帮助将 20 字节的立方体状态转换为 Herbert Kociemba 的算法和移动的立方体面

0 投票
1 回答
245 浏览

java - 围绕javaFX中的枢轴旋转对象

我正在尝试在 javaFX 中创建一个魔方,我正在努力解决面部的旋转问题。到目前为止,我只是将一张脸中的 9 个立方体添加到一个组中并旋转 90 度以使整个脸以正确的方式旋转,但是这种方法似乎不适用于多次旋转。

相反,我想围绕每个面中心的枢轴点旋转每个立方体。为此,我尝试使用内置在 pivot 参数中的 Rotate 类,但它似乎对旋转没有影响。这是我用来旋转正面的函数的简化版本,其中二维数组 frontFace 包含正面从左上角到右下角的所有立方体:

这会产生以下结果(我已将其旋转 45 度,以便更容易看到):

当前轮换

而我希望它像这样旋转:

理想旋转

这是我第一个使用 javaFX 的项目,任何帮助将不胜感激!到目前为止的完整项目可以在这里找到:

https://gofile.io/d/KidwKh

编辑:我被要求包含一个最小的、可重现的示例,所以我试图将问题浓缩到一个希望不会混淆的类中,这里是代码:

这是图像pallete.png,如果您想要颜色,则在代码中使用它,尽管我认为它与问题无关: pallete.png

谢谢。

0 投票
1 回答
166 浏览

c - 魔方 Thistlethwaite 算法,检查边缘是否良好

我正在尝试使用 Thistlethwaite 算法在 C 中构建一个魔方求解器。

我将一个多维数据集存储为 6 个uint64_t整数(面)的数组。
每个面都将 8 种颜色存储为一个字节。
这种结构让我可以使用位操作轻松旋转面部,但我想知道是否应该使用更适合 Thistlethwaite 算法的其他东西。

我遇到的问题是检查子组 G1 <L, R, F, B, U2,D2> 中是否包含多维数据集据我了解,该子组中包含具有正确定向边缘的多维数据集。(见https://www.jaapsch.net/puzzles/thistle.htm

页面末尾的论文清楚地说明了如何检查边缘是否良好,但我找不到实现它的方法。

我的问题是:如果给定一个加扰的立方体,边缘的方向是否正确,如何检查代码?

0 投票
0 回答
80 浏览

c# - 如何在两个重叠的对撞机之间进行选择

我正在用 unity3D 制作一个魔方生成器。我的生成器不仅生成立方体,还为立方体的每一侧生成“侧面对象”,如下所示:

立方体侧面示例

这些边对象只是带有碰撞器的空对象。这些碰撞器可以用来转动立方体的侧面,当用户点击碰撞器时,将除了其他侧面之外的所有东西都设置为它们的子对象,然后只旋转空的,如下所示:

这就是我的问题所在:我无法弄清楚父母一方的逻辑。

让我们想象这样一个事件:

在此处输入图像描述

用户点击红色标记的区域。哪一方有反应?我已经尝试过计算用户光标自第一次单击到当前位置后所经过的路径并将其与对撞机的方向进行比较,但我没有让它工作。

此外,当我将立方体块作为对撞机的子对象时,它们会变小。

我应该如何实现这个?

0 投票
2 回答
275 浏览

list - Physics.OverlapBox 太大

我正在做一个魔方模拟器。为了让两边转动,我在每一边都有一个碰撞器,我让碰撞器在点击时成为它们内部的所有东西的父级,然后转动侧面。

一侧的图片

为了得到碰撞器中的每个对象,我使用Physics.OverlapBox,并将除其他边之外的每个对象放在这样的列表中:

这就是问题所在:它似乎Physics.OverlapBox太大了,因为它得到了立方体的每一块和一些奇怪的丢失的游戏对象,如下所示: 问题

我试图改变transform.localScale / 2transform.lossy Scale / 2但它不起作用。我该怎么办?