洛谷 P1098 [NOIP2007 提高组] 字符串的展开

题目链接

分析

这题分为几个函数实现:判断是否展开、输出 m m m 次某个字符、循环展开。

坑点

  1. 有可能会有几个 - 号连续出现。
  2. 转换大小写时,必须先判断其是否为大小写,如果不是才转换。
  3. - 号两端如果相等也不行。

代码

#include 

using namespace std;

int n, m, f, l;
string a;

bool check(int k) {
	if (a[k] != '-') {
		return 0;
	} if(k <= 1 || k >= l) {
		return 0;
	} if (a[k - 1] >= a[k + 1]) {
	  return 0;
	} if (k == a[k + 1] == '-' || a[k - 1] == '-') {
		return false;
	} if (isdigit(a[k - 1])) {
		if (!isdigit(a[k + 1])) {
			return 0;
		}
	} else if (isdigit(a[k + 1])) {
		if (!isdigit(a[k - 1])) {
			return 0;
		}
	}
	return 1;
}
void print(char c){
	for (int i = 1; i <= m; i ++) {
		cout << c;
	}
}
void work(char c){
	if (n == 3) {
		print('*');
	}	else if (n == 2) {
		if (isdigit(c)) {
			print(c);
		} else {
			if (isupper(c)) {
				print(c);
			} else {
				print(c - 'a' + 'A');
			}
		}
	} else {
		if (isdigit(c)) {
			print(c);
		} else {
			if (islower(c)) {
				print(c);
			} else {
				print(c - 'A' + 'a');
			}
		}
	}
}
void fill(int k){
	if (f == 1) {
		for (char c = a[k - 1] + 1; c < a[k + 1]; c ++) {
			work(c);
		}
	}
	else {
		for(char c = a[k + 1] - 1; c > a[k - 1]; c --) {
			work(c);
		}
	}
}

int main(){
	cin >> n >> m >> f >> a;
	l = a.size();
	a = " " + a;
	for (int i = 1; i <= l; i ++) {
		if (check(i)) {
			fill(i);
		}
		else {
			cout << a[i];
		}
	}
	return 0;
}

你可能感兴趣的:(算法,c++,数据结构)