// HDU 1022 Train Problem I 附详细思路
// 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1022
// 栈其实就是高级的指针加数组…
// 这道题其实所有的数组都可以写成栈,但刚学不久不敢大意
// 题目说的意思就是模拟栈的过程,判断一组数能否在出入栈之后变成另一组数
// 解题的关键是每次入栈之后判断while(s.top()== *out_begin),想一想,如果成立就得出栈了^-^
// 源代码都有注释,看看就会了
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main()
{
int n;
int i,j;
char m1[20],m2[20];
int in_num[20],out_num[20];
int *in_begin,*in_end,*out_begin,out_end;
while(scanf("%d %s %s",&n,m1,m2)!=EOF)
{
for( i=0;i<n;i++ ) //以字符串输入,以整形数组处理
{
in_num[i]=m1[i]-'0';
out_num[i]=m2[i]-'0';
}
in_begin=in_num; in_end=in_num+n-1;
out_begin=out_num;
stack<int> s;
i=-1;
int in_or_out[40]={0,}; //"in"==1 "out"==2
while(in_begin <= in_end) //当in进栈过程
{
s.push(*in_begin) ;
i++;
in_or_out[i]=1; //"in"
while(s.top()== *out_begin) //栈顶是*out_begin的话表示该出栈了 /*关键步骤*/
{
s.pop();
out_begin++; //移到可以出的那一个
i++; //步骤数+1
in_or_out[i]=2; //"out"
if(s.empty())
break;
}
in_begin++; //向后移一位
}
if(s.empty()) //栈里没有出不去的数就是所有in的都out了
{
printf("Yes./n");
for(j=0;j<=i;j++) //i是步骤数目
{
if(in_or_out[j]==1)
printf("in/n");
if(in_or_out[j]==2)
printf("out/n");
}
}
else //栈里还有出去不了的数
{
printf("No./n");
}
printf("FINISH/n"); //终于看到FINISH了。。
}
return 0;
}
HDU 1022 Train Problem I 附详细思路
最新推荐文章于 2021-03-15 16:59:47 发布