关于Hanoi算法

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

posted @ 2018-07-17 11:36  刘凌枫羽  阅读(1230)  评论(0编辑  收藏  举报