求救,30分,玄关

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

要考虑两个“-”这个情况啊
by xwx654321 @ 2024-01-20 20:38:23


总体思路有问题,首先p33,p3不可能为3,读题了吗?
by qusia_MC @ 2024-01-21 18:28:29


改好了: @[wch666](/user/778382) ``` #include <bits/stdc++.h> using namespace std; int p1,p2,p3; char s[105]; void p31(int l,int r)//l,r,表示一个减号的左右两端区间,下同 { for(char x=s[l]+1; x<s[r]; x++) for(int j=1; j<=p2; j++) if(p1==3) { cout<<'*'; }//先判断如p1=3,那无论怎样都用*代替 else if(p1==1||(x>='0'&&x<='9')) { cout<<char(x); }//如果是数字或p1=1直接输出 else if(p1==2){ cout<<char(x-32);//否则转个大写 } } void p32(int l,int r ) { for(char x=s[l]-1; x>=s[r]+1; x--) for(int j=0; j<p2; j++)if(p1==3) { cout<<'*'; } else if(p1==1||(x>='0'&&x<='9')) { cout<<char(x); } else if(p1==2){ cout<<char(x-32); } //和上一样,不打了 } int main() { cin>>p1>>p2>>p3; cin>>s; int len=strlen(s); cout<<s[0]; for(int i=1; i<len; i++) { if(s[i] == '-'&&s[i-1]<s[i+1]&&i!=len-1&&s[i-1]!='-'&&s[i+1]!='-') //尾部的-直接输出 //两个或以上的-直接输出不展开 { if(s[i-1]>='0'&&s[i-1]<='9'&&(s[i+1]>='A'&&s[i+1]<='Z'||s[i+1]>='a'&&s[i+1]<='z')) { cout<<s[i]; } //一边数字一边字母不展开 else if(s[i-1]+1!=s[i+1]){ //不是后继 int c=s[i-1]; if(p3 == 1) p31(i-1,i+1); else if(p3 == 2) p32(i+1,i-1); cout<<s[i+1]; i++;//别忘处理 } } else { cout<<s[i]; } } return 0; } ``` 思路有问题,认真读一下题 坑点:开始结束的-直接输出 一边字母一边数字输出 两个以上-直接输出
by qusia_MC @ 2024-01-21 18:57:00


|