我必须解决一项任务,以确定Java中立方体塔的所有解决方案。
任务:
具有彩色表面(红色,蓝色,绿色,黄色)的四个立方体彼此堆叠并旋转,使得四个颜色中没有一个在墙壁的每一侧出现两次。
我必须开发一个系统,它将递归确定立方体塔的所有解决方案。
(比较一个名为“Instant Insanity” https://en.wikipedia.org/wiki/Instant_Insanity)
迭代地说,解决这个难题相对容易,但在我看来,递归方法非常困难。
Cube-Class:
private String[] colour;
public Cube() {
this.colour = new String[6];
for(int i = 0; i < colour.length; i++) {
colour[i] = colourRead();
}
}
我还有两个水平和垂直旋转立方体的功能,一个颜色的get函数和一个读取立方体颜色的函数。
立方塔级:
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<>();
}
如果立方体塔的一侧有颜色重复,我还有一个立方体的get函数和一个测试函数。
我不知道如何写一个函数来递归地确定所有解决方案。也许有人有如何解决这个难题的建议。谢谢你的帮助!
答案 0 :(得分:1)
这是递归方法的伪代码。
function findAllSolutions(cubeTower):
if cubeTower is None:
cubeTower = []
solutions = []
if length(cubeTower) < 4:
for each cube in possible cube rotations:
cubeTower.push(cube)
solutions.appendAll(findAllSolutions(cubeTower))
cubeTower.pop(cube)
else:
if (isValidSolution(cubeTower)):
solutions.push(copy of cubeTower)
return solutions