显然这是一道模拟(水题
作为第一篇题解就发个简单的
题意大概是给定一个字符串 用“-”省略 让我们填充“-”的内容
给定p1 p1==1填充小写字母 p1==2填充大写字母 p1==3填充“*”
给定p2 作为循环条件 为单个字母填充个数
p3为正序和逆序
显然除了破折号我们都按原来的字母输出
根据p1和p3分成六种情况
但这里有个坑点 就是判断他是否输出破折号 当左边大于等于右边时并不输出 而且两边类型不同时也不输出
怎么判断类型呢 这里我用了map来维护字母和数字的值
然后就可以愉快的进行小学生模拟拉
#include<cstdio> #include<iostream> #include<queue> #include<string> #include<map> using namespace std; int main() { //freopen("1.txt","w",stdout); int p1,p2,p3; scanf("%d%d%d",&p1,&p2,&p3); string a; cin>>a; map<char,int> mp; for(char i=‘a‘;i<=‘z‘;i++)mp[i]=1; for(char i=‘A‘;i<=‘Z‘;i++)mp[i]=1; for(char i=‘0‘;i<=‘9‘;i++)mp[i]=2; mp[‘-‘]=3; for(int i=0;i<a.size();i++) { if(a[i]!=‘-‘)printf("%c",a[i]); else{ if(a[i-1]>=a[i+1]||mp[a[i-1]]!=mp[a[i+1]]||a[i-1]==‘-‘||a[i+1]==‘-‘)printf("-"); else{ if(p3==1) { for(int j=a[i-1]+1;j<a[i+1];j++) { for(int k=1;k<=p2;k++) { if(p1==1) if(j>=‘A‘&&j<=‘Z‘)printf("%c",j+32); else printf("%c",j); if(p1==2) if(j>=‘a‘&&j<=‘z‘)printf("%c",j-32); else printf("%c",j); if(p1==3)printf("*"); } } } else{ for(int j=a[i+1]-1;j>a[i-1];j--) { for(int k=1;k<=p2;k++) { if(p1==1) if(j>=‘A‘&&j<=‘Z‘)printf("%c",j+32); else printf("%c",j); if(p1==2) if(j>=‘a‘&&j<=‘z‘)printf("%c",j-32); else printf("%c",j); if(p1==3)printf("*"); } } } } } } return 0; }
原文:https://www.cnblogs.com/-DDF-/p/9661428.html