P1098 字符串的展开 题解
Raileight
2018-12-18 16:04:48
# P1098 字符串的展开 题解
**1.只有P1对最后的输出有实质性影响,P2和P3最后在输出过程加个循环或是倒着循环就行 **
**2. 采取边处理边输出的策略**
**3.玄学判断是否数字,字母**
**4.具体内容看注释**
------------
```cpp
#include<iostream>
using namespace std;
string s;
int p[10];
void f(int n)
{
if(p[1] != 3 && s[n - 1] < s[n + 1])
{
if(p[3] == 1)//正序 且 输出字符
{
for(char j = s[n - 1] + 1 ; j < s[n + 1] ; j = j + 1)//只输出至后字母的前一位
{
for(int k = 1 ; k <= p[2] ; ++k)//控制重复次数
{
p[1] == 1 ? cout<<j : cout<<char(toupper(j));//是否大写
}
}
}
else//逆序
{
for(char j = s[n + 1] - 1 ; j > s[n - 1] ; j = j - 1)//只输出至后字母的前一位
{
for(int k = 1 ; k <= p[2] ; ++k)//控制重复次数
{
p[1] == 1 ? cout<<j : cout<<char(toupper(j));//是否大写
}
}
}
}
else if(s[n - 1] < s[n + 1])//输出*
{
for(char j = s[n - 1] + 1 ; j < s[n + 1] ; j = j + 1)
{
for(int k = 1 ; k <= p[2] ; ++k)
{
cout<<'*';
}
}
}
else//前字母大于后字母 ,前数字大于后数字
{
cout<<'-';
}
}
int main()
{
cin>>p[1]>>p[2]>>p[3]>>s;
p[4] = 1;
for(int i = 0 ; i < s.length() ; ++i)
{
if(s[i] != '-' || i == 0 || i == s.length() - 1) cout<<s[i];//不是“-”
else if(((s[i - 1] >= '0' && s[i - 1] <= '9') && (s[i + 1] >= '0' && s[i + 1] <= '9')) || ((s[i - 1] >= 'a' && s[i - 1] <= 'z') && (s[i + 1] >= 'a' && s[i + 1] <= 'z')) )
{
f(i);//是“-”,而且两边都是数字,或,两边都是字母
}
else
{
cout<<s[i];//两边类型不对应
}
}
return 0;
}
```