这题其实挺简单的,麻烦的是对情况的判断
- 确定好需要特殊输出的是‘-’部分,其他部分照常输出
- 遇见‘-’判断压缩合法性,非法则要输出‘-’,否之则不用
- 按照压缩规则输出,先考虑模式,再考虑字母还是数字,再考虑顺序
- 代码如下:
#include<string>
using namespace std;
//打印函数(左边字符,右边字符,模式,数量,顺序)
void pri(char l,char r,int ch,int sum,int st)
{
if (l + 1 == r)//当中间没有压缩数据则退出
return;
char x;
int len = r - l - 1;//打印的长度
if (ch == 3)//模式3只打印‘*’
x = '*';
else if (l >= 'a' && l <= 'z' && ch == 2&&st==1)//对模式2的字母特判-32变大写
x = l + 1-32;
else if (l >= 'a' && l <= 'z' && ch == 2 && st == 2)
x = r - 1-32;
else if (st == 1)//顺序则往后
x = l + 1;
else if (st == 2)//逆序则往前
x = r - 1;
while (len--)
{
for (int i = 0; i < sum; i++)
cout << x;
if (ch == 3)//模式3只打印‘*’
continue;
else if (st == 1)//顺序则往后
x++;
else//逆序则往前
x--;
}
}
int main()
{
int p1, p2, p3,i=0;
char l, r;
string s;
cin >> p1 >> p2 >> p3;
cin >> s;
while (i < s.size())//i为标记坐标
{
if (s[i] != '-')//非‘-’照常输出
cout << s[i++];
else
{
//记录左右字符
l = s[i - 1];
r = s[i + 1];
if (l >= 'a' && l <= 'z' && r >= 'a' && r <= 'z' && l < r)//字母合法情况
{
pri(l, r, p1, p2, p3);
i++;
}
else if (l >= '0' && r <= '9' && r >= '0' && r <= '9' && l < r)//数字合法情况
{
pri(l, r, p1, p2, p3);
i++;
}
else//非法情况照常输出
{
cout << '-';
i++;
}
}
}
}