我想弄清楚“河内之塔”难题的一些转折。
我想出了“河内之塔”难题算法,但是,我的目标是要使用不超过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数组,但是无法弄清楚如何正确地将它们实现到方法中。
答案 0 :(得分:0)
问题出在towersOfHanoi(...)
中的第一个If语句中。您将静态字符串放置为:
“将磁盘 1 从“ + fromTow +”移至“ + toTow
另外,一种更方便的打印与 n 相对应的字符的方法是:
(char) 96 + n
这将计算为
a,b,c,... n = 1,2,3,...