题目:排队
题目描述
OIER银行只有一个窗口,进去取钱的人们必须沿直线整齐排队,整条队只可以容得下26个人.而且宽度只能够一个人站立.所以OIER们排得不耐烦走人是很困难的.如果这人是在中间,那么必须前面所有人离开或后面所有人离开,然后走掉一个人,再重新恢复队伍.(当然,如果前面人少,就前面的人退出去;后面人少,就后面的人退出来,如果那个要走的人在中间,就后面的人离开,让别人先走.嘻嘻,看来OIER都很团结).
如我们给从后到前的人标号,为ABCDEF.那么C要走,A和B须从后面退出来,C才能够离开.然后先走的人先进,(注意顺序是反了的).那么变成BADEF.如果是D要走,那么E和F退出去再进来,变为ABCFE.
现在要求您编写程序,打印此过程.
输入格式
第一行为字符串字母(大写),表示人们的队伍顺序.字母不会重复.
第二行是S,表示接下来的S行,每一行有而且只有一个大写字母表示人需要离开的顺序.
输出格式
第一行输出最初的顺序.
接下来有S行,每行输每离开一个人后,队伍的顺序.
题解:
令我不解的是,我的代码只能的60分,此题需再研究。
代码:
View Code
1 #include<iostream>
2 using namespace std;
3
4 char a[27],b[27];int h=0,l,top=1;
5
6 void qianmian(int j){
7 int i;
8 for(i=h;i<j;i++)
9 {b[top]=a[i];top++;}
10 h++;
11 for(i=h;i<=j;i++)
12 {a[i]=b[top-1];top--;}
13 }
14
15 void houmian(int j){
16 int i;
17 for(i=l;i>j;i--)
18 {b[top]=a[i];top++;}
19 l--;
20 for(i=l;i>=j;i--)
21 {a[i]=b[top-1];top--;}
22 }
23
24 int main()
25 {
26 int s,i,j;
27 cin>>a>>s;
28 l=strlen(a)-1;
29
30 for(j=h;j<=l;j++)
31 cout<<a[j];
32 cout<<endl;
33 if(l==0) return 0;
34 for(i=1;i<=s;i++)
35 {
36 char q;
37 cin>>q;
38 j=h;
39 while(a[j]!=q)
40 j++;
41 if(j<=(l-h)/2)
42 qianmian(j);
43 else houmian(j);
44 for(j=h;j<=l;j++)
45 cout<<a[j];
46 cout<<endl;
47 }
48 return 0;
49 }