现在的位置: 首页 > 综合 > 正文

汉诺塔

2012年10月25日 ⁄ 综合 ⁄ 共 998字 ⁄ 字号 评论关闭

问题描述:与梵塔问题相同,设ABC是3个塔座,初始时塔座A上有四个圆盘,各圆盘从小到大编号为:1、2、3、4,奇数号圆盘为红色,偶数号圆盘为蓝色。现要求将塔座A上的圆盘移到塔座C上,除满足梵塔问题的移动规则外,还必须满足:任何时刻不允许将同色圆盘叠在一起。试设计一个算法,以最少次数完成上述移动,并输出每次移动的圆盘编号、起始塔座、目的塔座。并对自己的程序进行复杂性分析。

#include<iostream>
#include <stack>
#include<cstdio>
using namespace std;

int count=0;

void move(stack<char> &a,stack<char> &c)
{
	char flag1=a.top(); a.pop();
	char flag2=c.top();c.pop();
	
	if(!c.empty()&&(c.top()+a.top())%2==0)    //奇数加奇数为偶数,奇数加偶数为奇数
	{
		cout<<"移动过程中出现错误"<<endl<<endl;
	}

	cout<<"第"<<++count<<"次移动的圆盘编号为 "<<a.top()<<endl;
	cout<<"移动方向为:"<<flag1<<" -> "<<flag2<<endl<<endl;
	c.push(a.top());
	a.pop();
	c.push(flag2); a.push(flag1);
}

void haino(int n,stack<char> &c,stack<char> &a,stack<char> &b)    //借助于b,把a上的元素移动到c上
{
	if(n==1)
		move(a,c);
	else
	{
		haino(n-1,b,a,c);
		move(a,c);
		haino(n-1,c,b,a);
	}
}

int main()
{
	int i;
	int n;
	while(cin>>n)
	{
		stack<char> sa;
		stack<char> sb;
		stack<char> sc;
		for(i=n;i>0;i--)
		{
			sa.push(i+'0');
		}
		sa.push('A');
		sb.push('B');
		sc.push('C');
		haino(n,sc,sa,sb);
		cout<<"C 中的元素:"<<endl;
		while(!sc.empty())
		{
			cout<<sc.top()<<endl;
			sc.pop();
		}
	}
	
	system("pause");
	return 0;
}

抱歉!评论已关闭.