基础算法之三——递归法“汉诺塔问题”
题目描述
古代有一座汉诺塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示。有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且在移动过程中,3个座上的盘子始终要保持大盘在下,小盘在上。在移动过程中可以利用B座来放盘子。要求输出移动的步骤。
输入数据
汉诺塔内的盘子个数n。(1<n<64)
输出要求
输出移动的步骤,每行一步,如从A座移动到C座,输出“A->C”。
输入样例
3
输出样例
A->C
A->B
C->B
A->C
B->A
B->C
A->C
心得
用递归的思路来分析,最重要的是把原问题分解成一个或多个形式相同、但规模小一些的问题。把A座中的n个盘子通过B座中移动到C座,可以分成三个步骤:
1、把n-1个盘子借助C座,移到B座
2、把第n个盘放到C座上
3、把n-1个盘子借助A座,移到C座
解题思路:java描述
import java.util.Scanner;
public class QHanoi {
public static void Hanoi(int n, char src, char mid, char desc){
//n等于1时直接从src座移动到desc座
if(n == 1){
System.out.println(src + "->" + desc);
return;
}
//步骤1
Hanoi(n-1, src, desc, mid);
//步骤2
System.out.println(src + "->" + desc);
//步骤3
Hanoi(n-1, mid, src, desc);
return;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//接收整型输入
int n = scanner.nextInt();
if (n >= 1 && n <= 64) {
//赋值,开始换盘子
QHanoi.Hanoi(n, ‘A‘, ‘B‘, ‘C‘);
}
scanner.close();
}
}