汉诺塔问题--递归实现

来源:互联网 发布:魏强斌 知乎 编辑:程序博客网 时间:2024/05/20 18:47

问题描述: 

有一个梵塔,塔内有三个座A,B,C,A座上有若干个盘子,盘子大小不等,大的在下面,小的在上面。

目标:将A座上的盘子移动到C座上。

移动过程中可以借助B座,但每次只允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。

问题分析:

当要移动n 个盘子时,先移动A上的n-1个盘子到B上,再移动第n个盘子到C上;

当要移动n -1个盘子时,先移动A上的n-2个盘子到B上,再移动第n-1个盘子到C上;

当要移动n -2个盘子时,先移动A上的n-1-3个盘子到B上,再移动第n-2个盘子到C上;

当要移动2个盘子时,先移动A上的1个盘子到B上,再移动第2个盘子到C上;

当要移动1个盘子时,直接移动第1个盘子到C上;

所以可以采用递归的算法:

结束条件为:当要移动1个盘子时,直接移动第1个盘子到C上

#include <iostream>#include <stdio.h>using namespace std;void move(char x, char y){printf("%c------>%c\n", x, y);}void hano(int n, char one, char two, char three){if (1 == n){move(one, three);}else{hano(n - 1, one, three, two);move(one, three);hano(n - 1, two, one, three);}}int main(){int m;printf("input the  number of disks:");cin >> m;printf("The step to moving %d diskes:\n", m);hano(m, 'A', 'B', 'C');return 0;}


0 0