天天看点

NOIP 2001 普及组 复赛 求先序排列

NOIP 2001 普及组 复赛 求先序排列

1.初赛,这种题目做得多了去,但要上机写代码,突然捱了,尽然觉得有些困难。

2.不过,经验告诉我们,能用笔模拟出,那么也能用计算机算出。

3.目前,就是要靠手动模拟,找出规律。

4.//p1030 求先序排列

//http://blog.csdn.net/yuyanggo/article/details/47955837此文写得不错。

//根据上述文章进行编写,发现处理字符串位置时,十分困难,决定对程序进行改进,以方便编写为主

//经过一番调试,样例通过,提交AC。自认为本人代码量虽然大了些,但从编写角度,更容易写出,所谓“青出于蓝”

#include <stdio.h>

#include <string.h>

char in[10],post[10];//in中序 post后续

void pre(char *s1,char *s2){//s1中序  s2后序

    char *p,s3[10],s4[10];

    int k,len,i;

    len=strlen(s1);

    if(len==0)

        return;

    printf("%c",s2[len-1]);

    p=strchr(s1,s2[len-1]);

    k=p-s1;//此处忘记修改 k=p-in; 查了会

    for(i=0;i<k;i++)

        s3[i]=s1[i];

    s3[i]='\0';

    for(i=0;i<k;i++)

        s4[i]=s2[i];

    s4[i]='\0';

    pre(s3,s4);//左子树

    for(i=0;i<len-k-1;i++){

        s3[i]=s1[k+1+i];

    }

    s3[i]='\0';

    for(i=0;i<len-k-1;i++)

        s4[i]=s2[k+i];

    s4[i]='\0';

    pre(s3,s4);//右子树

}

int main(){

    int len;

    scanf("%s%s",in,post);

    pre(in,post);

    return 0;

}