双色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 }

 

你可能感兴趣的:(问题)