河内字母环塔

时间:2018-12-12 20:21:19

标签: java puzzle

我想弄清楚“河内之塔”难题的一些转折。

我想出了“河内之塔”难题算法,但是,我的目标是要使用不超过26(A..Z)的字母,而不是使用数字作为戒指。

我还被要求仅使用一个int参数调用拼图:

    public static void main(String args[]) 
{ 

    MyTools.moveDisks(3);


}

}

代替使用(int,char,char,char)参数的常规TOH方法。

这是我想出的:

    public static int count = 0;
public static char fromTow = 'A';
public static char toTow = 'B';
public static char tempTow = 'C';
public static char[] disks = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
        'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };



public static void towersOfHanoi (int n, char fromTow, char toTow, char tempTow, char disks[]) {

    count++;    

    if (n == 1) {
    System.out.println("Move disk 1 from " + fromTow + " to " + toTow);

    } else {
        towersOfHanoi(n - 1, fromTow, tempTow, toTow, disks);
    System.out.println("Move disk " + disks[n-1] + " from " + fromTow + " to " + toTow);

        towersOfHanoi(n - 1, tempTow, toTow, fromTow, disks);
    }

}

public static void moveDisks (int n) {
    count++;
    System.out.println("List of the moves for " + n + " disks:");

        if (n == 1) {
            System.out.println("Move disk a from " + fromTow + " to " + toTow);

        } else {
            towersOfHanoi(n-1, fromTow, tempTow, toTow, disks);
            System.out.println("Move disk " + disks[n-1] + " from " + fromTow + " to " + toTow);

            towersOfHanoi(n - 1, tempTow, toTow, fromTow, disks);

        System.out.println("The total number of moves is: " + count);



        }

    }

} 

使用Mytools.moveDisks(3)调用它会得到以下输出:

3个磁盘的移动列表:

将磁盘1从A移到B

将磁盘b从A移到C

将磁盘1从B移到C

将磁盘c从A移到B

将磁盘1从C移到A

将磁盘b从C移到B

将磁盘1从A移到B

移动的总数是:7

因此,除了磁盘字母外,其他所有东西都起作用。我尝试创建一个包含所有字母的char数组,但是无法弄清楚如何正确地将它们实现到方法中。

1 个答案:

答案 0 :(得分:0)

问题出在towersOfHanoi(...)中的第一个If语句中。您将静态字符串放置为:

  

“将磁盘 1 从“ + fromTow +”移至“ + toTow

另外,一种更方便的打印与 n 相对应的字符的方法是:

(char) 96 + n

这将计算为

  

a,b,c,... n = 1,2,3,...