双色Hanoi塔问题及判断指令
一.双色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 双色和单色没区别,就加了一条不可重色 3 打印出来的n必定是奇偶相邻 4 */ 5 #include <iostream> 6 using namespace std; 7 8 int main() 9 { 10 void hanoi(int,char,char,char); 11 int m; 12 while(cin >> m) 13 { 14 hanoi(m,'A','B','C'); 15 } 16 return 0; 17 } 18 19 void hanoi(int n,char a,char b,char c) 20 { 21 void move(int,char,char); 22 if(n==1) 23 move(n,a,b); 24 else 25 { 26 hanoi(n-1,a,c,b); 27 move(n,a,b); 28 hanoi(n-1,c,b,a); 29 } 30 } 31 32 void move(int n ,char x,char y) 33 { 34 cout<< n << " "<< x << " " << y <<endl; 35 }
二.指令判断问题
非法指令有以下两种情况:
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。
1 #include<algorithm> 2 #include<stack> 3 #include<cstring> 4 #include<iostream> 5 using namespace std; 6 7 int main() 8 { 9 int T,i,j,k; 10 int total, ope; 11 int from, to; 12 bool flag; 13 cin>>T; 14 while(T--) 15 { 16 stack<int> a[4]; 17 for(i=1; i<=4; i++) 18 { 19 while(!a[i].empty()) 20 a[i].pop(); 21 } 22 flag = true; 23 cin>>total>>ope; 24 for(i = total; i >= 1; --i) 25 a[1].push(i); 26 for(i = 0; i < ope; ++i) 27 { 28 cin>>from>>to; 29 if(a[from].empty()) 30 { 31 flag = false; 32 break; 33 } 34 if(!a[to].empty() && (a[to].top() < a[from].top())) 35 { 36 flag = false; 37 break; 38 } 39 a[to].push(a[from].top()); 40 a[from].pop(); 41 } 42 puts(flag ? "legal" : "illegal"); 43 } 44 return 0; 45 }
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.