程序员面试金典: 9.3栈与队列 3.4汉诺塔问题

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值