双色Hanoi塔问题及判断指令
2013-03-07 12:33
246 查看
一.双色Hanoi塔问题
<<设A、B、C是3 个塔座。开始时,在塔座A 上有一叠共n 个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,……,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。现要求将塔座A 上的这一叠圆盘移到塔座B 上,并仍按同样顺序叠 置。在移动圆盘时应遵守以下移动规则:
规则(1):每次只能移动1 个圆盘;
规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
规则(3):任何时刻都不允许将同色圆盘叠在一起;
规则(4):在满足移动规则(1)-(3)的前提下,可将圆盘移至A,B,C 中任一塔座上。
<<试设计一个算法,用最少的移动次数将塔座A 上的n个圆盘移到塔座B 上,并仍按同样顺序叠置。
对于给定的正整数n,编程计算最优移动方案。
Input:第1 行是给定的正整数n。
Output:每一行由一个正整数k 和2 个字符c1 和c2组成,表示将第k个圆盘从塔座c1移到塔座c2上。
二.指令判断问题
非法指令有以下两种情况:
1、某个针上已经没有金片了,但是指令依然要求从该处移动金片到其它针上。
2、把一个大的金片移动到了小的金片上。
输入 第一行输入一个整数N表示测试数据的组数(N<10) 每组测试数据的第一行有两个整数P,Q(1<P<64,1<Q<100),分别表示汉诺塔的层数与随后指令的条数 随后的Q行,每行都输入两个整数a,b(1<=a,b<=3)表示一条指令。 指令1 2表示把1号针最上面的金片移动到2号针最上面。 数据保证a,b不会相同。 输出 如果存在非法指令,请输出illegal 不存在非法指令则输出legal。
<<设A、B、C是3 个塔座。开始时,在塔座A 上有一叠共n 个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,……,n,奇数号圆盘着蓝色,偶数号圆盘着红色,如图所示。现要求将塔座A 上的这一叠圆盘移到塔座B 上,并仍按同样顺序叠 置。在移动圆盘时应遵守以下移动规则:
规则(1):每次只能移动1 个圆盘;
规则(2):任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
规则(3):任何时刻都不允许将同色圆盘叠在一起;
规则(4):在满足移动规则(1)-(3)的前提下,可将圆盘移至A,B,C 中任一塔座上。
<<试设计一个算法,用最少的移动次数将塔座A 上的n个圆盘移到塔座B 上,并仍按同样顺序叠置。
对于给定的正整数n,编程计算最优移动方案。
Input:第1 行是给定的正整数n。
Output:每一行由一个正整数k 和2 个字符c1 和c2组成,表示将第k个圆盘从塔座c1移到塔座c2上。
/* 双色和单色没区别,就加了一条不可重色 打印出来的n必定是奇偶相邻 */ #include <iostream> using namespace std; int main() { void hanoi(int,char,char,char); int m; while(cin >> m) { hanoi(m,'A','B','C'); } return 0; } void hanoi(int n,char a,char b,char c) { void move(int,char,char); if(n==1) move(n,a,b); else { hanoi(n-1,a,c,b); move(n,a,b); hanoi(n-1,c,b,a); } } void move(int n ,char x,char y) { cout<< n << " "<< x << " " << y <<endl; }
二.指令判断问题
非法指令有以下两种情况:
1、某个针上已经没有金片了,但是指令依然要求从该处移动金片到其它针上。
2、把一个大的金片移动到了小的金片上。
输入 第一行输入一个整数N表示测试数据的组数(N<10) 每组测试数据的第一行有两个整数P,Q(1<P<64,1<Q<100),分别表示汉诺塔的层数与随后指令的条数 随后的Q行,每行都输入两个整数a,b(1<=a,b<=3)表示一条指令。 指令1 2表示把1号针最上面的金片移动到2号针最上面。 数据保证a,b不会相同。 输出 如果存在非法指令,请输出illegal 不存在非法指令则输出legal。
#include<algorithm> #include<stack> #include<cstring> #include<iostream> using namespace std; int main() { int T,i,j,k; int total, ope; int from, to; bool flag; cin>>T; while(T--) { stack<int> a[4]; for(i=1; i<=4; i++) { while(!a[i].empty()) a[i].pop(); } flag = true; cin>>total>>ope; for(i = total; i >= 1; --i) a[1].push(i); for(i = 0; i < ope; ++i) { cin>>from>>to; if(a[from].empty()) { flag = false; break; } if(!a[to].empty() && (a[to].top() < a[from].top())) { flag = false; break; } a[to].push(a[from].top()); a[from].pop(); } puts(flag ? "legal" : "illegal"); } return 0; }
相关文章推荐
- linux shell 指令 诸如-d, -f, -e之类的判断表达式
- mybatis 基本类型的if条件判断问题 There is no getter for property named 'xxx' in 'class Java.lang.Integer'
- java中判断一个类的对象是否相等问题
- oracle使用LEFT JOIN关联产生的问题在查询结果中使用CASE WHEN 无法判断
- 输入 cc -c 指令出现问题
- 用JavaScript判断横屏竖屏问题。(转)
- 一般程序在哪里判断session过期问题比较好
- 2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
- jsp中的include指令的用法,include文件路径问题,txt文件的编码问题
- Jmeter解决响应码判断问题
- T00003 Hanoi塔问题
- 离开页面的判断:window.Onunload与window.onbeforeunload的区别(IE下a标签触发问题)
- ARM指令中如何判断一个立即数是 有效立即数
- 在gae后台判断数据是否存在 实体的ID DateTime时区的问题
- 括号问题 下面的代码用于判断一个串中的括号是否匹配 所谓匹配是指不同类型的括号必须左右呼应,可以相互包含,但不能交叉
- 判断是否为回文数与斐波拉契序列问题
- 根据Return Code判断gui连接SAP服务器的问题
- Hanoi塔问题
- 单点登录判断后乱码问题
- 并查集判断图有无回路问题之hdu1272