洛谷 P1098 字符串的展开

洛谷 P1098 字符串的展开

传送门

I'm here!


思路

大暴力字符串题
这个题让我们展开一个字符串\(某字符-某字符\),并且有三个参数对应几种不同的输出方式,首先想到打暴力,因为串特别小,最多才\(100\)

首先输入三个参数,之后输入一个字符串,按照题目要求进行模拟,一步步打暴力,最终\(AC\)(不知道为什么我第一次的代码在洛谷能得\(70\)分,输出也是对的,但是在老师机子上测却是\(0\)分)

下面详讲一下我的暴力程序:

\(p1\)对应三个值,\(1\)表示填充小写字母,\(2\)表示填充大写字母(当然都是针对字母),\(3\)表示填充\(\ast \ast\),这就有点棘手了,因为数字没有大写小写啊,所以我们需要判断是数字还是字母,之后再进一步处理

\(p2\)对应一个值,表示填充字符的数量,所以我们可以套一层循环输出\(p2\)个需要输出的数

\(p3\)也是个麻烦,\(1\)表示顺序输出,\(2\)表示逆序输出,所以还得加个判断

知道了这些,我们就可以开始一个字符一个字符的循环了(我的暴力程序充分展现了\(continue\)的作用),首先,只要它不是减号,我们就输出它并\(continue\),如果它是减号,但是前面后面的字符\(ASCII\)码的值只差一,就不在输出这个减号,即直接\(continue\),那么剩下的不是字母就是数字了,所以就开始判断是不是数字,肯定是要从\(s[i-1]\)\(s[i+1]\)展开的(经过了上面的筛选此时\(s[i]\)一定是个减号)然后优先判断\(p1\)是不是为\(3\),如果是就按照要求输出\(\ast\),然后判断\(p3\)的值,决定逆序还是顺序,直接加一遍关于\(p2\)的循环输出中间的数即可

字母同是,只不过还要判断小写大写

经过了一系列的摧残与打击之后,能过留下来的便是英雄,我们光荣的直接输出它

记录我美妙的\(AC\)之路(早早\(100\)分的那些都不真实\(qwq\)
美妙的AC之路


代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<stack>
#include<cstdlib>
#define N 511
#define MOD 100000007
#define INF 0x3f3f3f3f
using namespace std;

string s,s1;
int p1,p2,p3;
int len;

int main() {
    //freopen("expand.in","r",stdin);
    //freopen("expand.out","w",stdout);
    scanf("%d%d%d",&p1,&p2,&p3);
    cin>>s;
    len=s.length();
    for(int i=0; i<len; i++) {
        if(s[i]!='-') {
            cout<<s[i];
            continue;
        }
        if(s[i+1]-s[i-1]==1)continue;
        if(s[i-1]>='0'&&s[i-1]<='9'&&s[i+1]>='0'&&s[i+1]<='9') {
            if(s[i+1]<=s[i-1]) {
                cout<<s[i];
                continue;
            }
            if(p1==3) {
                for(int j=s[i-1]+1; j<s[i+1]; j++) {
                    for(int k=1; k<=p2; k++) {
                        cout<<"*";
                    }
                }
                continue;
            }
            if(p3==1) {
                for(int j=s[i-1]+1; j<s[i+1]; j++) {
                    for(int k=1; k<=p2; k++) {
                        cout<<char(j);
                    }
                }
                continue;
            }
            if(p3==2) {
                for(int j=s[i+1]-1; j>s[i-1]; j--) {
                    for(int k=1; k<=p2; k++) {
                        cout<<char(j);
                    }
                }
                continue;
            }
        }
        if(s[i-1]>='a'&&s[i-1]<='z'&&s[i+1]>='a'&&s[i+1]<='z') {
            if(s[i+1]<=s[i-1]) {
                cout<<s[i];
                continue;
            }
            if(p1==3) {
                for(int j=s[i-1]+1; j<s[i+1]; j++) {
                    for(int k=1; k<=p2; k++) {
                        cout<<"*";
                    }
                }
                continue;
            }
            if(p3==1) {
                if(p1==1) {
                    for(int j=s[i-1]+1; j<s[i+1]; j++) {
                        for(int k=1; k<=p2; k++) {
                            cout<<char(j);
                        }
                    }
                    continue;
                }
                if(p1==2) {
                    for(int j=s[i-1]+1; j<s[i+1]; j++) {
                        for(int k=1; k<=p2; k++) {
                            cout<<char(j-32);
                        }
                    }
                    continue;
                }
            }
            if(p3==2) {
                if(p1==1) {
                    for(int j=s[i+1]-1; j>s[i-1]; j--) {
                        for(int k=1; k<=p2; k++) {
                            cout<<char(j);
                        }
                    }
                    continue;
                }
                if(p1==2) {
                    for(int j=s[i+1]-1; j>s[i-1]; j--) {
                        for(int k=1; k<=p2; k++) {
                            cout<<char(j-32);
                        }
                    }
                    continue;
                }
                
            }
        }
        cout<<s[i];
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}

蒟蒻只能讲到这个地步了,真的没法再详细了.......

转载于:https://www.cnblogs.com/loceaner/p/10899976.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值