汉诺塔
来源:互联网 发布:java软件开发项目经验 编辑:程序博客网 时间:2024/05/17 04:20
问题描述:与梵塔问题相同,设ABC是3个塔座,初始时塔座A上有四个圆盘,各圆盘从小到大编号为:1、2、3、4,奇数号圆盘为红色,偶数号圆盘为蓝色。现要求将塔座A上的圆盘移到塔座C上,除满足梵塔问题的移动规则外,还必须满足:任何时刻不允许将同色圆盘叠在一起。试设计一个算法,以最少次数完成上述移动,并输出每次移动的圆盘编号、起始塔座、目的塔座。并对自己的程序进行复杂性分析。
#include<iostream>#include <stack>#include<cstdio>using namespace std;int count=0;void move(stack<char> &a,stack<char> &c){char flag1=a.top(); a.pop();char flag2=c.top();c.pop();if(!c.empty()&&(c.top()+a.top())%2==0) //奇数加奇数为偶数,奇数加偶数为奇数{cout<<"移动过程中出现错误"<<endl<<endl;}cout<<"第"<<++count<<"次移动的圆盘编号为 "<<a.top()<<endl;cout<<"移动方向为:"<<flag1<<" -> "<<flag2<<endl<<endl;c.push(a.top());a.pop();c.push(flag2); a.push(flag1);}void haino(int n,stack<char> &c,stack<char> &a,stack<char> &b) //借助于b,把a上的元素移动到c上{if(n==1)move(a,c);else{haino(n-1,b,a,c);move(a,c);haino(n-1,c,b,a);}}int main(){int i;int n;while(cin>>n){stack<char> sa;stack<char> sb;stack<char> sc;for(i=n;i>0;i--){sa.push(i+'0');}sa.push('A');sb.push('B');sc.push('C');haino(n,sc,sa,sb);cout<<"C 中的元素:"<<endl;while(!sc.empty()){cout<<sc.top()<<endl;sc.pop();}}system("pause");return 0;}
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- 汉诺塔
- Ubuntu 12.04 使用gnome3图形界面
- HDU 4004 The Frog's Games(二分)
- ftp自动上传下载脚本
- 简单的makefile框架
- 你真的愿意到了50岁还要做编程吗?
- 汉诺塔
- vs2005应用程序正常初始化失败的解决方案
- IT“咏叹调”之--你公司哪个部门是“老大”?
- Hi,我们的代码重构了
- 运维架构师-并不遥远的彼岸
- Java实现RSS
- IPv6简介
- 瑞星:以创新引领个人安全市场
- 在 Xcode 中进行自动化测试 (1/2)