2020牛客寒假算法基础集训营5 C C语言IDE
https://ac.nowcoder.com/acm/contest/3006/C
一个事实是我被题面和题解代码吓着了
事实证明题解做了一个更高难度的版本
我现在也不知道题解代码在干啥
事实证明在出题人去掉若干情况后,这道题也不是很难
只要想做总能啃下来
这种需要自己构造思路方法的模拟题还是贼好的
我的思路
1、# // /* */ 这些涵盖的代码内容直接略过
2、{ } 里面的代码略过
3、处理这一个‘{’ 与 上一个‘}’之间的代码
① 把能去掉的空格都去掉,留下的空格满足后面是字母,前面是字母或者‘*’
② 最后一个‘(’与它前面‘\n’之间的内容就是函数类型和函数名。(这里取最后一个是去掉最前面先声明的函数)
③ 最后一个‘(’和最后一个‘)’之间的代码,以逗号分割,一个一个提取出来即可
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char s[5000],a[5000],b[5000],t[5000]; int main() { bool we=false,st=false,bi=false,br=false,tag; int n=0,sum=0,m=0,k,l,r,blank,len,now,last,th,tmp; while(scanf("%c",&s[++n])!=EOF); for(int i=1;i<=n;++i) { if(s[i]=='#') we=true; else if(s[i]=='/' && s[i+1]=='*') st=true,++i; else if(s[i]=='*' && s[i+1]=='/') st=false,++i; else if(s[i]=='/' && s[i+1]=='/') bi=true,++i; else if(s[i]=='\n') a[++m]='\n',we=bi=false; else if(we || st || bi) continue; else if(s[i]=='{') { sum++; if(sum==1) { br=true; k=0; for(int j=1;j<=m;++j) if(a[j]!=' ') b[++k]=a[j]; else if((isalpha(a[j-1]) || a[j-1]=='*') && isalpha(a[j+1])) b[++k]=a[j]; b[k+1]='\0'; if(strrchr(b+1,'(')==NULL) continue; l=strrchr(b+1,'(')-b; blank=len=0; for(int j=l;j && b[j]!='\n';--j) { t[++len]=b[j]; if(b[j]==' ') blank++; } reverse(t+1,t+len+1); last=l; while(strchr(b+last+1,',')!=NULL) { now=strchr(b+last+1,',')-b; tmp=now; while(b[now]!=' ') now--; now--; th=1; t[len+th]=','; for(int j=now;j>last;--j) { ++th; t[len+th]=b[j]; } reverse(t+len+1,t+len+th+1); len+=th; last=tmp; } r=strrchr(b+1,')')-b; while(b[r]!=' ') r--; r--; th=0; for(int j=r;j>last;--j) { ++th; t[len+th]=b[j]; } reverse(t+len+1,t+len+th+1); len+=th; t[++len]=')'; t[len+1]='\0'; printf("%s\n",t+1); m=0; } } else if(s[i]=='}') { sum--; if(!sum) br=false; } else if(br) continue; else a[++m]=s[i]; } }