【发布时间】:2017-06-12 15:29:01
【问题描述】:
我必须解决一项任务,以确定 Java 中立方体塔的所有解决方案。
任务:
四个具有彩色表面(红色、蓝色、绿色、黄色)的立方体相互堆叠并旋转,这样四种颜色中的任何一种都不会在墙壁的每一侧出现两次。
我必须开发一个系统,该系统将递归确定立方体塔的所有解决方案。
(与名为 “Instant Insanity” https://en.wikipedia.org/wiki/Instant_Insanity 的谜题相比)
迭代解决这个难题相对容易,但我认为递归方法非常困难。
立方体类:
private String[] colour;
public Cube() {
this.colour = new String[6];
for(int i = 0; i < colour.length; i++) {
colour[i] = colourRead();
}
}
我还有两个函数来水平和垂直旋转立方体,一个获取颜色的函数和一个读取立方体颜色的函数。
Cube-Tower-Class:
private Cube[] cube;
private ArrayList<String> solutions;
private int solutionCounter = 1;
public CubeTower() {
this.cube= new Cube[4];
this.cube[0] = new Cube();
this.cube[1] = new Cube();
this.cube[2] = new Cube();
this.cube[3] = new Cube();
this.solutions = new ArrayList<>();
}
我还有一个获取立方体的函数和一个用于测试的函数,如果立方体塔的一侧有重复的颜色。
我不知道如何编写一个函数来递归地确定所有解决方案。也许有人对如何解决这个难题有建议。谢谢你的帮助!
【问题讨论】:
-
在技术层面上,将迭代解决方案转换为递归解决方案(对于任何问题)只需将局部变量(从外部,但在循环中使用)转换为方法参数。然后,您可以进一步简化它们(如果信息过多,甚至可以将信息包装在一个对象中)。
-
向我们展示您正在使用的迭代方法
-
@RAZ_Muh_Taz 还没有编码,但它基本上与不同立方体的位置有关:立方体有 24 个不同的位置,它们可以说谎。您可以通过旋转功能更改位置。因此,在立方体 1 所在的每个位置,您现在将立方体 2 旋转到其 24 个位置,对于立方体 2 所在的每个位置,您旋转立方体 3,依此类推。所以总共你有整个立方体塔的 24^3 种不同的解决方案。立方体 4 每次旋转后,检查塔的解是否合法。如果是,则将其添加到解决方案中,否则,循环继续工作。
-
@Rogue 谢谢你的帮助,我会试试的
-
如果您可以使用迭代方法来工作,我很乐意帮助您使用递归方法。由于涉及的开销,递归方法往往比迭代方法花费更长的时间。