UVa101 - The Blocks Problem

题目地址:点击打开链接

C++代码:

#include <iostream>
#include <string>
#include <stack>
using namespace std;
const int maxsize = 30;
int main()
{
	int n;
	cin>>n;
	stack<int> st[maxsize];
	int position[maxsize];
	int i;
	for(i=0;i<n;++i)
	{
		st[i].push(i);
		position[i]=i;
	}
	string s1,s2;
	int a,b;
	while(cin>>s1&&s1!="quit")
	{
		cin>>a>>s2>>b;
		if(position[a]!=position[b])
		{
			if(s1=="move")
			{
				if(s2=="onto")
				{
					while(st[position[a]].top()!=a)
					{
						int temp=st[position[a]].top();
						st[position[a]].pop();
						position[temp]=temp;
						st[temp].push(temp);
					}
					while(st[position[b]].top()!=b)
					{
						int temp=st[position[b]].top();
						st[position[b]].pop();
						position[temp]=temp;
						st[temp].push(temp);
					}
					st[position[a]].pop();
					position[a]=position[b];
					st[position[b]].push(a);
				}
				else
				{
					while(st[position[a]].top()!=a)
					{
						int temp=st[position[a]].top();
						st[position[a]].pop();
						position[temp]=temp;
						st[temp].push(temp);
					}
					st[position[a]].pop();
					position[a]=position[b];
					st[position[b]].push(a);
				}
			}
			else
			{
				if(s2=="onto")
				{
					while(st[position[b]].top()!=b)
					{
						int temp=st[position[b]].top();
						st[position[b]].pop();
						position[temp]=temp;
						st[temp].push(temp);
					}
					stack<int> sti;
					while(st[position[a]].top()!=a)
					{
						int temp=st[position[a]].top();
						st[position[a]].pop();
						position[temp]=position[b];
						sti.push(temp);
					}
					st[position[a]].pop();
					st[position[b]].push(a);
					position[a]=position[b];
					while(!sti.empty())
					{
						int temp=sti.top();
						sti.pop();
						st[position[b]].push(temp);
					}
				}
				else
				{
					stack<int> sti;
					while(st[position[a]].top()!=a)
					{
						int temp=st[position[a]].top();
						st[position[a]].pop();
						position[temp]=position[b];
						sti.push(temp);
					}
					st[position[a]].pop();
					st[position[b]].push(a);
					position[a]=position[b];
					while(!sti.empty())
					{
						int temp=sti.top();
						sti.pop();
						st[position[b]].push(temp);
					}
				}
			}
		}
	}
	for(i=0;i<n;++i)
	{
		cout<<i<<":";
		stack<int> sti;
		while(!st[i].empty())
		{
			int temp=st[i].top();
			st[i].pop();
			sti.push(temp);
		}
		while(!sti.empty())
		{
			cout<<" "<<sti.top();
			sti.pop();
		}
		cout<<endl;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值