洛谷P1098字符串的展开

1. 题目描述

题目过长在此展示不便。

详细内容见原题地址

2. Notes

2.1. 简化条件判断

如果条件判断只需要if...else...对立条件判断且每个子句里只有一句的话,可以考虑a?b:c来简化过程。

2.2. 理解好单元化(unit)

洛谷P1067多项式输出中说到有规律性的输出一些东西要有单元化(unit)模板化的思维。通过这个题可以再总结一下,衡量单元化的标准:

  1. 每次循环相当于处理一个单元。
  2. 每个单元的结构应该是类似的,可以构造成模板。

如本题中,每一个字符(字母,数字,-)可以作为一个单元,而形如a-d这样需要特殊处理的格式就不适合作为一个单元,因为与不需要特殊处理的普通字符格式不兼容。

2.3. 代码要逐步完善

写代码时,对于题目中的要求,可以逐步完善,步步为营,可以一开始功能比较简陋,然后再补充,但是记得为了代码的精简,输出的位置尽量控制在同一个位置,不要有很多条件判断,对应不同的输出,这样一来代码冗长,二来即使写错了也修改不便。

比如在这个题目中,代码书写时,输出口cout<<c只留了一个,先考虑简单的由参数p2控制的输出个数,完成后再考虑由参数p3控制的是否逆序,最后才考虑由参数p1控制的字母大写和输出*。

3. 题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<bits/stdc++.h>
using namespace std;
int main(){
int p1,p2,p3,i,j,size;
string str;
cin>>p1>>p2>>p3>>str;
for(i=0;i<str.length();i++){
if(str[i]=='-'&&(str[i+1]>str[i-1])
&&((str[i-1]>='0'&&str[i+1]<='9')
||(str[i-1]>='a'&&str[i+1]<='z'))){
size=str[i+1]-str[i-1]-1;
char c;
p3==2?c=str[i+1]:c=str[i-1];
if(p1==2&&c>='a'&&c<='z'){
c-=32;
}
for(j=0;j<size;j++){
p3==2?c--:c++;
for(k=0;k<p2;k++){
if(p1==3){
cout<<"*";
}else{
cout<<c;
}
}
}
}else{
cout<<str[i];
}
}
return 0;
}