http://acm.timus.ru/problem.aspx?space=1&num=1993
题意:题目中那么多英语直接就没看,看了样例知道是什么意思了,就是给你一个字符串,算是一个句子,若是复杂句,是有“ ,”作为分割为两个句子的,若是不加任何括号的就原样输出,若是有括号的先输出花括号里的,再输出中括号里的,再输出小括号里的,每一句话只有第一个字母大写。
思路 :模拟题吧,一向挺烦的,万一哪个细节没注意到就容易出错。
#include<cstdio> #include<cstring> #define maxn 1000 using namespace std; char s[maxn],s1[maxn]; int a[maxn],b[maxn]; int main() { while(gets(s)) { int m,t; int k=strlen(s); bool flag=false; for(int i=0; i<k; i++) { if(s[i]=='{'||s[i]=='('||s[i]=='[') { s[i+1]+=32; break; } } for(int i=0; i<k; i++) { if(s[i]==',') { flag=true; m=i; break; } } if(!flag) { for(int i=0; i<k; i++) { if(s[i]=='{') a[1]=i; else if(s[i]=='(') a[2]=i; else if(s[i]=='[') a[3]=i; else if(s[i]=='}') b[1]=i; else if(s[i]==')') b[2]=i; else if(s[i]==']') b[3]=i; } t=1; while(t<=3) { for(int j=a[t]+1; j<b[t]; j++) { if(t==1&&j==a[t]+1) printf("%c",s[j]-32); else printf("%c",s[j]); } if(t!=3) printf(" "); t++; } printf("\n"); } else if(flag) { for(int i=0; i<m; i++) { if(s[i]=='{') a[1]=i; else if(s[i]=='(') a[2]=i; else if(s[i]=='[') a[3]=i; else if(s[i]=='}') b[1]=i; else if(s[i]==')') b[2]=i; else if(s[i]==']') b[3]=i; } t=1; while(t<=3) { for(int j=a[t]+1; j<b[t]; j++) { if(t==1&&(j==a[t]+1)) printf("%c",s[j]-32); else printf("%c",s[j]); } if(t!=3) printf(" "); t++; } int cc; for(int j=m; j<k; j++) { if(s[j]=='{'||s[j]=='('||s[j]=='[') { cc=j; break; } else printf("%c",s[j]); } for(int i=cc; i<k; i++) { if(s[i]=='{') a[1]=i; else if(s[i]=='(') a[2]=i; else if(s[i]=='[') a[3]=i; else if(s[i]=='}') b[1]=i; else if(s[i]==')') b[2]=i; else if(s[i]==']') b[3]=i; } t=1; while(t<=3) { for(int j=a[t]+1; j<b[t]; j++) { printf("%c",s[j]); } if(t!=3) printf(" "); t++; } printf("\n"); } } return 0; }