这题其实挺简单的,麻烦的是对情况的判断

  1. 确定好需要特殊输出的是‘-’部分,其他部分照常输出
  2. 遇见‘-’判断压缩合法性,非法则要输出‘-’,否之则不用
  3. 按照压缩规则输出,先考虑模式,再考虑字母还是数字,再考虑顺序
  • 代码如下:
#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++;
			}
		}
	}
}