题解 | #[NOIP2007]字符串的展开#
[NOIP2007]字符串的展开
https://ac.nowcoder.com/acm/problem/16644
本题所采用的思想并不复杂,只是情况较多,尤其是注意字符串的开始和结尾都是'-'
的情况
#include <iostream> using namespace std; #include <ctype.h> void Print_Char(char left, char right, int p1, int p2, int p3) { //如果减号右边的字符恰好是左边字符的后继,只删除中间的减号 if(right-left == 1) printf(""); else if(right <= left) printf("-"); else { char temp; //正序输出 if(1 == p3) { for(temp = left+1; temp < right; temp++) { for(int i = 0; i < p2; i++) { if(1 == p1) printf("%c", tolower(temp)); else if(2 == p1) printf("%c", toupper(temp)); else if(3 == p1) printf("*"); } } } else if(2 == p3) //逆序输出 { for(temp = right-1; temp > left; temp--) { for(int i = 0; i < p2; i++) { if(1 == p1) printf("%c", tolower(temp)); else if(2 == p1) printf("%c", toupper(temp)); else if(3 == p1) printf("*"); } } } } } int main(void) { char str[105]; int p1, p2, p3; scanf("%d%d%d", &p1, &p2, &p3); scanf("%s", str); int i, j; //排除开头都是-的情况 for(j = 0; str[j] != '\0'; j++) { if(str[j] == '-') printf("-"); else break; } //遍历字符串 for(i = j; str[i] != '\0'; i++) { if(str[i] != '-') printf("%c", str[i]); else if(str[i] == '-' && str[i+1] == '\0') //如果最后一项是-,则输出- printf("-"); else if(abs(str[i+1]-str[i-1]) > 26) printf("-"); else Print_Char(str[i-1], str[i+1], p1, p2, p3); } return 0; }