java经典算法——河内算法(Hanoi)
有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动,设移动次数为H(n)。
原理:
当n=1时,H(1)=1,即A—>C;
当n=2时,H(2)=3,即A—>B,A—>C,B—>C;
当n>2时,可以将第1个盘子到第n-1个盘子看成一个整体为①,这样就仍为两个盘子:
第一步:①从A—>B:共H(n-1)步;
第二步:n 从A—>C:共1步;
第三步:①从B—>C:共H(n-1)步.
public static void main(String args[]) throws IOException { int n; BufferedReader buf; buf = new BufferedReader(new InputStreamReader(System. in )); System.out.print("请输入盘数:"); n = Integer.parseInt(buf.readLine()); Hanoi hanoi = new Hanoi(); hanoi.move(n, 'A', 'B', 'C'); } public void move(int n, char a, char b, char c) { //第二步: 最底下的1个盘子,从A移到C if (n == 1) { System.out.println("盘 " + n + " 由 " + a + " 移至 " + c); } else { //第一步:把上面(n-1)个盘子从A移到B move(n - 1, a, c, b); System.out.println("盘 " + n + " 由 " + a + " 移至 " + c); //第三步:把(n-1)个盘子从B移到C move(n - 1, b, a, c); } }
转载自:https://blog.csdn.net/wkedward1937/article/details/52667657