c代码,对生活感到很无奈,乐于助人的伙伴帮帮我

P1030 [NOIP2001 普及组] 求先序排列

建议你学会申请全局变量,OI代码基本都要申请全局变量,几个局部变量传来传去很混乱,尤其是传地址,会提高出错率
by CreeperLordVader @ 2019-02-13 20:08:13


你可以看看刘汝佳的《算法竞赛入门经典》里的前4章,那里面不仅有语言知识,还有OI的很多重要技巧,然后看看第5章,学几个基本的STL和C++语法对OI来说基本上就够用了(至少我不是那种狂飙C++11语法特性和大量用指针的)
by CreeperLordVader @ 2019-02-13 20:11:47


@[2307512217csh](/space/show?uid=180355) 方法不对 ```cpp #include <stdio.h> #include <string.h> const int MAX_N=10; char ans[MAX_N]; int pos=0; inline int find(char *q,char c) { char *p; int i = 0; for (p=q;1;p++) { if (*p==c) return i; i++; } } char s[MAX_N]={}; void swap(int a,int b) { int t=a; a=b; b=t; } char *form(char p[],int n,int m) { // printf("p1:%s\n",p); int len_p=strlen(p); int i,j; for(i=n,j=0;i<len_p,j<m;i++,j++) { s[j]=p[i]; } s[j]='\0'; // printf("p2:%s\n",p); return s; } void dfs(char in[],char after[],int i) { int len_in=strlen(in); int len_after=strlen(after); if(len_in>0) { char c=after[len_after-1]; ans[pos++]=c; int k=find(in,c); // printf("dfs(%d):",i); // printf("%s\n",in); dfs(form(in,0,k),form(after,0,k),i+1); dfs(form(in,k+1,len_in),form(after,k,len_in),i+1); } } int main() { char a[10],b[10]; scanf("%s",a); scanf("%s",b); dfs(a,b,1); puts(ans); return 0; } ```
by Smile_Cindy @ 2019-02-13 20:24:25


@[CreeperLordVader](/space/show?uid=68207) 灰常感谢您
by 阿狸阿璃 @ 2019-02-14 11:42:42


@[Alpha](/space/show?uid=87058) 灰常感谢您,我试了一下,答案是对的,但评测只有60分。如果不介意的话,我可以问你几个问题吗?第一个,为啥要用数组输出答案啊,单个不行吗?第二个,swap函数交换有啥用啊,好像下面都没用到,第三个,dfs函数为啥有三个参数啊,那个i放进去是因为一定要表示深度吗?第四个,那两个dfs函数递归是同时进行的呢,还是进行完前面一个再进行后一个呢?第五个,form(after,k,len_in)这里为啥不是len_in-1呢,那样不是会多记录一个字符吗? 不好意思,不好意思,我啥都不懂,请见谅,望您能解答我,谢谢。
by 阿狸阿璃 @ 2019-02-14 13:19:39


@[2307512217csh](/space/show?uid=180355) 1.单个的话,调试不方便 2.swap是因为我是C++党,可能要用 3.i是为了方便调试用的 4.先进行第一个后进行第二个 5.len_in和len_in-1一样效果
by Smile_Cindy @ 2019-02-14 13:27:01


|