您的位置:首页 > 其它

双色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上。

  

/*
双色和单色没区别,就加了一条不可重色
打印出来的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: