字符串的展开

【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 }

 

posted @ 2019-09-08 12:37  GTR_PaulFrank  阅读(627)  评论(0编辑  收藏  举报