汉诺塔问题是一个古典的数学模型,是一个用递归问题解决的典型例子,问题如下:古代有个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不定,大的在下,小的在上。有一个老和尚想把这64个盘子从A移到C,但规定一次只能移动一个盘子,且在移动过程中在3个座上始终保持大盘在下,小盘在上,在移动过程中可利用B座。
*C 为目的基座
将n个盘子看成两部分,前 n-1 块看作一个整体,和 第 n 块
此时移动盘子只需要三步
1、需要把 前 n-1 块这个整体 从 A 移动到 B 上。此过程需要借助C ,即 A — C—> B
2、在将第n块 从 A移动到 C 。
3、最后将前 n-1 块这个整体 从 B 移动到 C 上。此过程需要借助 A ,
即 B — A —> C*
#include<stdio.h>
#include<windows.h>
#pragma warning ( disable:4996)
void hanoi(int n, char A, char B, char C)
{
if (n == 1)
{
// n == 1时,只剩下最后一块,只需将其 从 A移动到目的位置 C 上
printf("%c——>%c\n",A,C);
}
else{
//前 n-1 块需要移动到B,
//在此过程中,需要先借助C位置,才能将 前n-1块 从A ——>B
// A — C —>B , 从 A 借助C 移动到B
hanoi(n-1, A, C, B);
printf("%c——>%c\n", A, C);
// 将前n-1 块 ,从 A移动到 目的基座C ,
//B — A —> C ,从 B 借助A 移动到C
hanoi(n - 1, B, A, C);
}
}
int main()
{
int n = 0;
printf("输入盘子个数:");
scanf("%d", &n);
hanoi(n,'A' , 'B', 'C');
system("pause");
return 0;
}