Luogu P1098 [NOIP2007 T2] 字符串的展开

 

题解

  模拟+字符串

  展开的过程很容易实现,关键的坑是‘-’位置和判断是否展开

  输入可能出现-424-,j--e,p-8-l-6的情况

  具体情况看代码

#include<cstdio>
#include<cstring>
using namespace std;
char a[110],z,y;
int main()
{
    int l,i,j,k,p1,p2,p3;
    scanf("%d%d%d
",&p1,&p2,&p3);
    scanf("%s",a+1);
    l=strlen(a+1);
    for(i=1;i<=l;i++)
    {
        if(a[i]=='-')
        {
            z=a[i-1];y=a[i+1];
            if(i==1){printf("-");continue;}//如果第一个字符是-,跳过 
            else if(i==l){printf("-");continue;}//如果最后一个字符是-,跳过 
            else if(z=='-'||y=='-'){printf("-");continue;}//出现连续两个-,跳过 
            else if((z>='0'&&z<='9'&&y>='a'&&y<='z')||(y>='0'&&y<='9'&&z>='a'&&z<='z')){printf("-");continue;}//-左右不同时是字母或数字,不展开 
            else if(y-z==1)continue;//-左右连续,省略- 
            else if(y<=z){printf("-");continue;}
            else
            {
                if(p1==3)//'*'填充 
                {
                    for(j=z+1;j<y;j++)
                        for(k=1;k<=p2;k++)
                            printf("*");
                }
                else if(z>='0'&&z<='9')//数字填充 
                {
                    if(p3==1)//正序 
                    for(j=z+1;j<y;j++)
                        for(k=1;k<=p2;k++)
                            printf("%c",j);
                    else//倒序 
                    for(j=y-1;j>z;j--)
                        for(k=1;k<=p2;k++)
                            printf("%c",j);
                }
                else//字母填充 
                {
                    if(p1==1)//小写字母 
                    {
                        if(p3==1)//正序 
                        for(j=z+1;j<y;j++)
                            for(k=1;k<=p2;k++)
                                printf("%c",j);
                        else//倒序 
                        for(j=y-1;j>z;j--)
                            for(k=1;k<=p2;k++)
                                printf("%c",j);
                    }
                    else//大写字母 
                    {
                        z-=32;y-=32;//转大写字母 
                        if(p3==1)//正序 
                        for(j=z+1;j<y;j++)
                            for(k=1;k<=p2;k++)
                                printf("%c",j);
                        else//倒序 
                        for(j=y-1;j>z;j--)
                            for(k=1;k<=p2;k++)
                                printf("%c",j);
                    }
                }
            }
        } 
        else printf("%c",a[i]);
    }
    return 0;
} 
原文地址:https://www.cnblogs.com/wisdom-jie/p/13589108.html