字符串的展开
【TIMEgate】
https://www.luogu.org/problem/P1098
【解题思路】
此题看起来很复杂,实践起来其实不是特别难,仔细审题不难发现:影响输出的是p1和p3,p2其实无关紧要,只要在循环输出的时候作为边界即可。
所以我们可以通过三目运算符来少写几个for循环让代码变得简洁。
【code】
1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 using namespace std;
5 int n,p1,p2,p3;
6 char s[205];
7 void onechar(int k){
8 int i;
9 char c=(char)k;
10 if (p1==2 && islower(c)) c-=32;
11 if (p1==3) c='*';
12 for (i=1;i<=p2;i++)
13 printf("%c",c);
14 }
15 void expand(int b,int e){
16 int i;
17 if (p3==1)
18 for (i=b+1;i<e;i++)
19 onechar(i);
20 if (p3==2)
21 for (i=e-1;i>b;i--)
22 onechar(i);
23 }
24 int main(){
25 scanf("%d %d %d\n",&p1,&p2,&p3);
26 gets(s);
27 n=strlen(s);
28 int i,a,b;
29 for (i=0;i<n;i++){
30 if (s[i]!='-' || i==0 || i==n-1)
31 printf("%c",s[i]);
32 else{
33 a=s[i-1];
34 b=s[i+1];
35 if ((isdigit(a)&&isdigit(b) || islower(a)&&islower(b))&&(b-a>1))
36 expand(a,b);
37 else
38 if (b-a!=1)
39 printf("%c",s[i]);
40 }
41 }
42 return 0;
43 }