#include <iostream>
#include <stdio.h>
using namespace std;
/*
问题:汉诺塔问题。N个盘子按从小到大放在第一根柱子上。还有第二个和第三个柱子,请将
所有盘子从第一个柱子移动到第三个柱子上。
分析:
N个盘子:
步骤1:需要将N-1个盘子,从第1个柱子拿到第2个柱子,
步骤2:再从第1个柱子将最下面的盘子从第1个柱子拿到第3个柱子
步骤3:将N-1个盘子从第2个柱子拿到第3个柱子
输入:
1(汉诺塔个数)
2
3
输出:
1->3,
1->2,1->3,2->3,
1->3,1->2,3->2,1->3,2->1,2->3,1->3,
关键:
1 Hannuota(N-1 , from , to , middle);//将N-1个盘子从from柱子移动到中间过渡的middle柱子上
Hannuota(1 , from , middle , to); //将最后剩余的1个盘子从from柱子移动到目的to柱子上
Hannuota(N-1, middle, from , to); //将N-1个盘子从中间过渡的middle柱子移动到目的to柱子上
2 如果用栈实现:本质上就是将递归改成栈。3个柱子等同于3个栈。
对move部分改成从from栈中弹出一个元素,从to栈中压入一个元素。递归部分不变
*/
void move(int from ,int to)
{
cout << from << "->" << to << ",";
}
void Hannuota(int N, int from , int middle , int to)
{
//递归基
if(N == 1)
{
move(from, to);
return; //注意终止
}
//递归步
Hannuota(N-1 , from , to , middle);//将N-1个盘子从from柱子移动到中间过渡的middle柱子上
Hannuota(1 , from , middle , to); //将最后剩余的1个盘子从from柱子移动到目的to柱子上
Hannuota(N-1, middle, from , to); //将N-1个盘子从中间过渡的middle柱子移动到目的to柱子上
}
int main(int argc, char* argv[])
{
int n;
while(cin >> n)
{
Hannuota(n, 1 , 2 , 3);
cout << endl;
}
getchar();
return 0;
}
程序员面试金典: 9.3栈与队列 3.4汉诺塔问题
最新推荐文章于 2020-04-30 19:33:59 发布