C++数据结构与STL--递归--汉诺塔
2013-07-26 08:47
225 查看
Tips:因为要大盘子不能在小盘子上面,所以,init杆上最大的盘子肯定是首先要移动到des杆上的。
于是问题就转化为:
*先把init杆的n-1个盘子全部移动到tem杆,[b]以des杆为临时辅助[/b]
*然后把init的最大盘子移动到des杆,
*接着把tem杆上的所有盘子移动到des杆,[b]以init杆为临时辅助
[/b] 当盘子的个数大于1时,就不停的重复以上三个步骤。
下图给出3个盘子时的递归过程:
实现代码:
//n代表盘子的数目,init代表盘子所在的初始化杆,
//des代表盘子移向的目的杆,tem代表交换时的临时辅助杆
void hanoi(int n,string init,string tem,string des)
{
if(n==1)//停止条件:移动一个盘子
{
cout<<init<<"==>"<<des<<endl;
return;
}
hanoi(n-1,init,des,tem);// 把n-1个盘子从init移动tem,以des为临时辅助
cout<<init<<"==>"<<des<<endl;//移动最大的盘子
hanoi(n-1,tem,init,des);//把n-1个盘子从tem移动到des,以init为辅助
}
int main()
{
hanoi(3,"A","B","C");
return 0;
}
运行结果
于是问题就转化为:
*先把init杆的n-1个盘子全部移动到tem杆,[b]以des杆为临时辅助[/b]
*然后把init的最大盘子移动到des杆,
*接着把tem杆上的所有盘子移动到des杆,[b]以init杆为临时辅助
[/b] 当盘子的个数大于1时,就不停的重复以上三个步骤。
下图给出3个盘子时的递归过程:
实现代码:
//n代表盘子的数目,init代表盘子所在的初始化杆,
//des代表盘子移向的目的杆,tem代表交换时的临时辅助杆
void hanoi(int n,string init,string tem,string des)
{
if(n==1)//停止条件:移动一个盘子
{
cout<<init<<"==>"<<des<<endl;
return;
}
hanoi(n-1,init,des,tem);// 把n-1个盘子从init移动tem,以des为临时辅助
cout<<init<<"==>"<<des<<endl;//移动最大的盘子
hanoi(n-1,tem,init,des);//把n-1个盘子从tem移动到des,以init为辅助
}
int main()
{
hanoi(3,"A","B","C");
return 0;
}
运行结果
相关文章推荐
- C++数据结构与STL--递归--进制转换
- C++ STL的底层数据结构都是啥
- 递归:解决汉诺塔问题(数据结构3.2 P103)
- c++ 数据结构之STL之 map
- C++数据结构与STL--栈的实现
- C++数据结构与STL--双向循环链表(实现自定义iterator类)
- 递归:解决汉诺塔问题(数据结构3.2 P103)
- 递归:解决汉诺塔问题(数据结构3.2 P103)
- C++数据结构与STL--栈的应用--后缀表达式的计算
- 递归:解决汉诺塔问题(数据结构3.2 P103)
- 【数据结构与算法】递归汉诺塔
- 递归:解决汉诺塔问题(数据结构3.2 P103)
- 数据结构基础(6)--递归和函数调用--汉诺塔问题C语言实现
- 递归:解决汉诺塔问题(数据结构3.2 P103)
- 递归:解决汉诺塔问题(数据结构3.2 P103)
- 【数据结构与算法】汉诺塔算法——java递归实现
- 递归:解决汉诺塔问题(数据结构3.2 P103)
- 数据结构与C++stl(2) 仿函数
- 数据结构之汉诺塔(递归)
- 【数据结构与算法】(五) c 语言递归与汉诺塔实现