剔除特解以后的分类讨论
#include <iostream>
using namespace std;
// p1=1填写小写字母 p1=2填写大写字母 p1=3填写'*'
// p2=k中间填写的东西每个要有k个
// p3=1保持原有顺序 p3=2逆序
int main()
{
int p1, p2, p3;
cin >> p1 >> p2 >> p3;
string s;
cin >> s;
// 用于输出
string output = "";
int i = 0;
for (i = 0; i < s.length(); i++)
{
if (s[i] == '-')
{
if (i == 0 || i == s.length() - 1 || (s[i - 1] <= 'z' && s[i - 1] >= 'a' && s[i + 1] <= '9' && s[i + 1] >= '0') || (s[i + 1] <= 'z' && s[i + 1] >= 'a' && s[i - 1] <= '9' && s[i - 1] >= '0') || s[i - 1] >= s[i + 1] || s[i - 1] == '-' || s[i + 1] == '-')
{ // 边界位置判定+字母和数字不匹配的情况
output += s[i];
continue;
}
else
{
int loop = int(s[i + 1] - s[i - 1] - 1); // 循环大小
for (int j = 0; j < loop; j++)
{
// 情况1,如果p1==3,输出星号
if (p1 == 3)
for (int k = 0; k < p2; k++)
output += '*';
// 情况2,如果p1==1&&p3==1,输出小写字母或者数字
if (p1 == 1 && p3 == 1)
for (int k = 0; k < p2; k++)
output += s[i - 1] + j + 1;
// 情况3,如果p1==2&&p3==1,输出大写字母
if (p1 == 2 && p3 == 1)
for (int k = 0; k < p2; k++)
if (s[i - 1] <= 'z' && s[i - 1] >= 'a')
output += s[i - 1] + j - 31;
else
output += s[i - 1] + j + 1;
// 情况4,如果p1==1&&p3==2,逆序输出
if (p1 == 1 && p3 == 2)
for (int k = 0; k < p2; k++)
output += s[i + 1] - j - 1;
// 情况5,如果p1==2&&p3==2,逆序输出
if (p1 == 2 && p3 == 2)
for (int k = 0; k < p2; k++)
if (s[i - 1] <= 'z' && s[i - 1] >= 'a')
output += s[i + 1] - j - 33;
else
output += s[i + 1] - j - 1;
}
}
}
else
output += s[i];
}
cout << output << endl;
return 0;
}