洛谷 P1098 字符串的展开
洛谷 P1098 字符串的展开
传送门
思路
大暴力字符串题
这个题让我们展开一个字符串\(某字符-某字符\),并且有三个参数对应几种不同的输出方式,首先想到打暴力,因为串特别小,最多才\(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\))
代码
#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;
}
蒟蒻只能讲到这个地步了,真的没法再详细了.......