因前期一直不理解汉诺塔的移动问题 所以借此休息时刻重新学习
图例:
口述一下过程(三个方块的移动):三个方块从小到大为123
3移动到c的过程:(此时123在a)
3从a移动到c 前提12移动到b(中转)
2从a移动到b 前提1移动到c (中转)
2移动到c的过程:(此时12在b)
2从b移动到c 前提1移动到a(中转)
1移动到c的过程:(此时1在a)
1从a移动到c(不需要中转,因为1是最小的)
思路:
移动两块方块及以上时
起始位置移动到目标位置需要借助中转位置
起始,中转,目标 位置是变化的
规定了起始位置,目标位置,那么剩下的位置就为中转位置
例:A移动到C B为中转 C移动到B A为中转
代码实现
#include<stdio.h>
// 三根柱子
// | | |
// | | |
// A B C
// 1: a->c
// 2: a->b a->c b->c
// 3: a->c a->b c->b a->c b->a b->c a->c
void move(char pos1,char pos2)
{
printf("%c->%c \n", pos1, pos2);
}
// 起始位置 中转位置 目的位置
void hanoi(int n,char pos1,char pos2,char pos3)
{
if (n == 1)
{
move(pos1, pos3);//将盘子从起始位置挪动到目的位置
}
else
{ // 因为无法直接移动到目的位置 所以要借助另一个未使用的位置当中转位置
hanoi(n - 1, pos1, pos3, pos2);//将最大的盘子之外的所有盘子通过c(中转位置)移动到b(目的位置)
move(pos1, pos3); //移动
hanoi(n - 1, pos2, pos1, pos3);//再把(b上)最大的盘子之外的所有盘子
//从b通过a(中转位置)移动到c(目的位置)
}
}
int main()
{
int n;
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}