剔除特解以后的分类讨论

#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;
}