汉诺塔
Posted 鹏达君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汉诺塔相关的知识,希望对你有一定的参考价值。
例四、汉诺塔
1、问题描述
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
2、结论
①如果只能移动到相邻的 那么n个圆盘需要
f(n)=(3^n)-1 次
②如果不加上只能移动到相邻的限制的话 那么n个圆盘需要f(n)=(2^n)-1次
3、代码实现
package org.Stone6762.MStack.adopt;
/**
* @ClassName_Hanoi汉诺塔问题
* @author_Stone6762
*/
public class Hanoi {
/**
* @count记录是第几次移动
*/
private static int count = 0;
/**
* @Describe_将塔座x上按直径大小自上而下编码为123...n个圆盘按规则一到塔座Z上_y做辅助塔座
* @param n圆盘的格式
* @param x起始圆盘的位置
* @param y辅助塔座
* @param z目标塔座
*/
public static void hanoi(int n, char x, char y, char z) {
if (n == 1) {
move(x, 1, z);//
} else {
hanoi(n - 1, x, z, y);// 将前n-1个从x移动到y,z当辅助
move(x, n, z);// 将变化为n的圆盘从x移动到z
hanoi(n - 1, y, x, z);// 再将前n-1个圆盘从y移动到z,x当辅助
}
}
/**
* @Describe_移动操作_将编号为n的圆盘从x移动到z
* @param x
* @param n
* @param z
*/
public static void move(char x, int n, char z) {
System.out.println("第 " + (++count) + "次移动 :" + n + "号圆盘," + x + "-->"
+ z);
}
/**
* @Describe_规则再次变化_再加上一个只能移动到相邻的限制条件
* @param n
* @param x
* @param y
* @param z
*/
public static void hanoi2(int n, char x, char y, char z) {
if (n == 1) {
move(x, 1, y);//
move(y, 1, z);//
} else {
hanoi2(n - 1, x, y, z);// 将前n-1个从x移动到z,y当辅助
move(x, n, y);// 将变化为n的圆盘从x移动到y
hanoi2(n - 1, z, y, x);// 再将前n-1个圆盘从z移动到x,y当辅助
move(y, n, z);// 将变化为n的圆盘从y移动到z
hanoi2(n - 1, x, y, z);// 将前n-1个从x移动到z,y当辅助
}
}
public static void main(String[] args) {
// Hanoi.hanoi(4, ‘x‘, ‘y‘, ‘z‘);//------可以移动到相邻的或者不相邻的
// Hanoi.hanoi2(4, ‘x‘, ‘y‘, ‘z‘);//-----只能移动到相邻的
}
}
以上是关于汉诺塔的主要内容,如果未能解决你的问题,请参考以下文章