从立方体塔中递归确定所有解决方案

时间:2017-06-12 15:29:01

标签: java algorithm recursion

我必须解决一项任务,以确定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函数和一个测试函数。

我不知道如何写一个函数来递归地确定所有解决方案。也许有人有如何解决这个难题的建议。谢谢你的帮助!

1 个答案:

答案 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