您的位置:首页 > 大数据 > 人工智能

hdu 1022 Train Problem I 栈

2010-02-11 22:22 573 查看

TrainProblemI

[b]TimeLimit:2000/1000MS(Java/Others)MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):3121AcceptedSubmission(s):1148[/b]ProblemDescriptionAsthenewtermcomes,theIgnatiusTrainStationisverybusynowadays.Alotofstudentwanttogetbacktoschoolbytrain(becausethetrainsintheIgnatiusTrainStationisthefastestallovertheworld^v^).Butherecomesaproblem,thereisonlyonerailwaywhereallthetrainsstop.Soallthetrainscomeinfromonesideandgetoutfromtheotherside.Forthisproblem,iftrainAgetsintotherailwayfirst,andthentrainBgetsintotherailwaybeforetrainAleaves,trainAcan'tleaveuntiltrainBleaves.Thepicturesbelowfigureouttheproblem.Nowtheproblemforyouis,thereareatmost9trainsinthestation,allthetrainshasanID(numberedfrom1ton),thetrainsgetintotherailwayinanorderO1,yourtaskistodeterminewhetherthetrainscangetoutinanorderO2.InputTheinputcontainsseveraltestcases.Eachtestcaseconsistsofaninteger,thenumberoftrains,andtwostrings,theorderofthetrainscomein:O1,andtheorderofthetrainsleave:O2.Theinputisterminatedbytheendoffile.MoredetailsintheSampleInput.OutputTheoutputcontainsastring"No."ifyoucan'texchangeO2toO1,oryoushouldoutputalinecontains"Yes.",andthenoutputyourwayinexchangingtheorder(youshouldoutput"in"foratraingettingintotherailway,and"out"foratraingettingoutoftherailway).Printalinecontains"FINISH"aftereachtestcase.MoredetailsintheSampleOutput.SampleInput
3123321
3123312
SampleOutput
Yes.
in
in
in
out
out
out
FINISH
No.
FINISH
HintHint
ForthefirstSampleInput,welettrain1getin,thentrain2andtrain3.
Sonowtrain3isatthetopoftherailway,sotrain3canleavefirst,thentrain2andtrain1.
InthesecondSampleinput,weshouldlettrain3leavefirst,sowehavetolettrain1getin,thentrain2andtrain3.
Nowwecanlettrain3leave.
Butafterthatwecan'tlettrain1leavebeforetrain2,becausetrain2isatthetopoftherailwayatthemoment.
Soweoutput"No.".
设进出两个顺序分别为order1和order2,如果此时栈为空或者当前的栈顶元素不等于order2[i],就让order1[j]入栈,同时将"in"记录入q队列中。
else如果此时栈顶元素等于order2[i],就将此栈顶元素弹出(sk.pop()),并将"out"记录入q队列。
不断进行上面上面两个判断,直到两个数组遍历完,或者在中途中达不到目标顺序,使程序停止。
#include<iostream>#include<queue>#include<stack>#include<string>usingnamespacestd;intn;inti,j;charorder1[12],order2[12];voidcal(){	stack<char>sk;	queue<string>q;		for(i=0,j=0;i<n&&j<=n;)	{		if(sk.empty()||sk.top()!=order2[i])		{			if(j==n)			{				cout<<"No./nFINISH"<<endl;				return;			}			sk.push(order1[j++]);			q.push("in");		}		else		{			sk.pop();			q.push("out");			i++;		}	}		cout<<"Yes."<<endl;	stringch;	while(!q.empty())	{		ch=q.front();		cout<<ch<<endl;		q.pop();	}	cout<<"FINISH"<<endl;}intmain(){		while(cin>>n)	{		cin>>order1>>order2;		cal();	}	return0;}
上面代码较为简略了,后来又写了一次,下面代码比较清晰:
#include<iostream>#include<string>#include<vector>#include"functional"#include<memory.h>#include<vector>#include"numeric"#include"algorithm"usingnamespacestd;#definemin(a,b)a>b?b:a#defineN12#defineIN0#defineOUT1charo1,o2;intseq[N*2];intidx;intcal(intn){	intc1=0,c2=0;	vector<char>V;	//V.push_back(o1[c1++]);	while(c1<=n)	{		while(!V.empty()&&V.back()==o2[c2])		{			V.pop_back();			seq[idx++]=OUT;			c2++;		}		while((V.empty()||V.back()!=o2[c2])&&c1<=n)		{			V.push_back(o1[c1]);			seq[idx++]=IN;			c1++;		}			}	if(c2<n)		returnfalse;	returntrue;}intmain(){	intn;	while(cin>>n)	{		idx=0;		cin>>o1>>o2;		if(cal(n))		{			cout<<"Yes."<<endl;			for(inti=0;i<n*2;i++)			if(seq[i]==IN)				cout<<"in"<<endl;			else				cout<<"out"<<endl;		}		else			cout<<"No."<<endl;		cout<<"FINISH"<<endl;	}	return0;}
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: