给定三根柱子,记为 A,B,C,其中 A 柱子上有 n 个盘子,从上到下编号为0到n -1,且上面的盘子一定比下面的盘子小。
问: 将A 柱上的盘子经由 B 柱移动到 C 柱最少需要多少次?
移动时应注意:一次只能移动一个盘子
下图为汉诺塔问题图片
汉诺塔首先用到递归的思想,一层一层的分析。
首先汉诺塔就是不断移动上面的方块,从A移动到C。
先将第n个方块从A移动到C位置。
然后将第n-1个方块从A移动到C位置。
.........
然后将第2个方块移动到C位置。
最后把第1个方块移动到C位置。
明白这些后,我们以当有3个汉诺塔时,进行排序移动。
1. 将A位置上的前n-1个全部移到B位置
2.将A位置上第n个全部移动到C位置
3.然后将B位置上的前n-2个全部移动A位置上
4.将B位置上的第n-1个移动到C位置上
..........
这样就构成了递归,我们只需要不断重复1.2.3.4.步
我们上代码
void hanoi(int n, char A, char B, char C)
{
if (n == 1)
{
printf("%c->%c\n", A, C);//只剩最后一个的时候
}
else
{
hanoi(n - 1, A, C, B);将前n-1个方块从A绕C到B柱上
//此时A位置上有第n个方块。
printf("%c->%c\n", A, C);//将A位置上的第n个方块移动到C上。
hanoi(n - 1, B, A, C);//将B位置上剩下的第n-2个方块从B绕A到C柱上
}
}
int main()
{
int n = 0;
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
运算结果