uva10152(Stack 数组巧用)

本文探讨了一种涉及乌龟堆叠的算法挑战,通过分析原始乌龟序列和目标序列,设计了一种策略来确定哪些乌龟需要移动到塔顶以达到期望的顺序。文章详细解释了解决方案的思路,包括如何使用栈数据结构来跟踪乌龟的移动,并提供了实现这一解决方案的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

他让每只乌龟都站在另一只乌龟的背上,然后把它们堆成九只乌龟的一堆。然后耶特尔爬了上去。他坐在桩上。多美的景色啊!他能看到“最多一英里!              

耶特尔国王希望重新安排他的乌龟王位,使他最高级的贵族和最亲密的顾问更接近上层。一个单一的操作可以改变龟在堆栈中的顺序:一只龟可以爬出它在堆栈中的位置,爬到其他龟的上方坐在上面。给定海龟堆栈的原始顺序和同一海龟堆栈的必需顺序,您的工作是确定将原始堆栈重新排列到所需堆栈的最小操作序列。              

输入              

输入的第一行由一个整数k组成,给出测试用例的数量。每个测试用例都包含一个整数n,给出堆栈中海龟的数量。接下来的n行指定海龟堆栈的原始顺序。每一行都包含一只乌龟的名字,从栈顶的乌龟开始,一直到栈底的乌龟。海龟有独特的名字,每个名字都是由字母数字字符、空格字符和句号(“.”)组成的字符集中不超过80个字符组成的字符串。输入中接下来的n行给出了所需的堆栈顺序,再次从上到下命名海龟。每个测试用例总共由2n+1行组成。海龟数量(n)将小于或等于200只。              

输出              

对于每个测试用例,输出由一系列海龟名称组成,每行一个,指示海龟离开它们在堆栈中的位置并爬到顶部的顺序。此操作序列应将原始堆栈转换为所需的堆栈,并且应尽可能短。如果可能有多个最短长度的解,则可以报告其中任何一个解。在每个测试用例后打印一个空白行。

Sample Input 


Yertle 
Duke of Earl 
Sir Lancelot 
Duke of Earl 
Yertle 
Sir Lancelot 

Yertle 
Duke of Earl 
Sir Lancelot 
Elizabeth Windsor 
Michael Eisner 
Richard M. Nixon 
Mr. Rogers 
Ford Perfect 
Mack 
Yertle 
Richard M. Nixon 
Sir Lancelot 
Duke of Earl 
Elizabeth Windsor 
Michael Eisner 
Mr. Rogers 
Ford Perfect 
Mack 


Sample Output 
Duke of Earl 
Sir Lancelot 
Richard M. Nixon 
Yertle 
Sample Output
Duke of Earl
Sir Lancelot 
Richard M. Nixon 
Yertle

这个题目的英文真是头大,就是先给出一队的序列,在给出一队序列,序列中是乌龟的名字,要将第一队的顺序变为第二队,乌龟可以从他当前的位置爬到最顶端(只能是最顶端,不能是其他位置,可能看英文没有理解好题意)。要求输出那几个乌龟上爬了,并且也要按照先后顺序(谁先爬的,谁后爬的)。这个有点 Stack 的意思,先进后出,谁上爬了就会在 Stack 的栈顶附近(这道题目是从下往上爬)。怎么用栈来解释这道题目呢?就先看这个题目的意思吧,就是将一些乌龟从地下搬到最顶上,原来乌龟位置就会来一个新的乌龟(移动乌龟  的上一个乌龟就会下来),所以说,这几个被移动的乌龟被拿到上面去,其他乌龟占用他们的位置,我们就可以从后往前(从底下的乌龟往上匹配),相同乌龟就不用管,两个乌龟不同,说明有乌龟被移走了,就继续匹配原序列的乌龟(两个序列匹配都是从下往上匹配的),直到将原序列都匹配一遍后,这时占中,还有没有乌龟,就是被移走的乌龟。

上面说的是乌龟的顺序(从底往上),到达栈中就是从栈顶到栈底。

最后输出被移动的乌龟时,就是出栈的顺序。

include<iostream>
using namespace std;
#include<bits/stdc++.h>
const int maxn=10005;
typedef long long ll;

int main()
{
	int i,j;
	
	int t;
	cin>>t;
	while(t--)
	{
		stack<string>mp;
		string s[maxn];
		
		int n;
		cin>>n;
		getchar();
		string name;
		for(i=0;i<2*n;i++)
		{
			getline(cin,name);
			if(i<n)
				s[i]=name;
			else
				mp.push(name);
		}
		
		i=n-1;
		while(!mp.empty()&&i>=0)
		{
			if(s[i]==mp.top())
				mp.pop();
			
			i--;
		}
		
		while(!mp.empty())
		{
			cout<<mp.top()<<endl;
			mp.pop();
		}
		cout<<endl;
		
	}
	return 0;
}

好妙。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值