双色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 }
原文地址:https://www.cnblogs.com/hxsyl/p/2947808.html