zoukankan      html  css  js  c++  java
  • uva 10562 Undraw the Trees

    //提交通过,时间0.008,本题主要是字符串处理,以及层序建树,以及前序(DFS递归)

    //遍历3个知识点,细节问题是字符串的处理,以及空树的处理

     

    #include <stdio.h>
    #include <string.h>
    #define MAX 40010
    struct tree
    {
        char data;
        int l,r;  //最左边的孩子下标和最右边的孩子下标
        int x,y;  //它自身在最开始的字符矩阵中的列和行,x是列,y是行
    }tree[MAX];
    char string[210][210];
    char stack[MAX];  int top,line;
    
    void input()
    {
        int i=1;
        while(1)
        {
            gets(string[i]);
            if(!strcmp(string[i],"#")) break;
            i++;
        }
        line=i;
    //    for(i=1; i<line; i++) printf("%s\n",string[i]);
    }
    void test_print(int n)
    { int i; for(i=0; i<n; i++) printf("%c  %d  %d\n",tree[i].data , tree[i].l , tree[i].r);}
    void create_tree()
    {
        int front=0,rear=0,i,j,X,Y,L,R;
        for(i=0; string[1][i]!='\0'; i++) if( string[1][i]!=' ' && string[1][i]!='|' && string[1][i]!='#') break;
        tree[rear].data=string[1][i]; tree[rear].x=i; tree[rear].y=1; tree[rear].l=tree[rear].r=-1; rear++;
        while(front<rear)
        {
            Y=tree[front].y; X=tree[front].x;  L=R=-1;
            if( (Y+1)<line && string[Y+1][X]=='|')  //有孩子
            {
                L=rear;
                Y=Y+2;   //既然有孩子就扫描再下面的那行
                for(i=X; i>=0; i--)  if(string[Y][i]!='-') break; X=i+1;
                for(i=X; string[Y][i]=='-' && string[Y+1][i]!='\0'; i++ ) 
                    if(string[Y+1][i]!=' ' && string[Y+1][i]!='|' && string[Y+1][i]!='#') 
                    { 
                        tree[rear].data=string[Y+1][i]; 
                        tree[rear].l=-1; tree[rear].r=-1; 
                        tree[rear].y=Y+1; tree[rear].x=i; 
                        rear++;
                    }
                R=rear-1;
                tree[front].l=L; tree[front].r=R;
            } 
            front++;
        }
    //    test_print(rear);
    }
    void dfs(int s)
    {
        int i;
        if(s==-1)  return ;
        stack[++top]=tree[s].data;
        stack[++top]='(';
        for(i=tree[s].l; i<=tree[s].r; i++) dfs(i);
        stack[++top]=')';
        return ;
    }
    int main()
    {
        int i,n,T;
        scanf("%d",&T); getchar();
        while(T--)
        {
            input();
            if(!strcmp(string[1] , "#"))  {printf("()\n"); continue;}
            create_tree();
            top=-1; stack[++top]='('; i=0; 
            dfs(i); 
            stack[++top]=')'; stack[++top]='\0';
            printf("%s\n",stack);
        }
        return 0;
    }

     

  • 相关阅读:
    iPhone开发之多线程使用
    iPhone开发之启动画面及动画
    Keyboard 遮挡 UITextField
    iPhone发布之图标大小和设置
    Linux文件目录及其作用
    UIView设置背景图片
    通过点击事件轮换隐藏和显示导航栏
    内存检测
    iPhone开发之自定义柱状图
    给UIImageView添加点击事件
  • 原文地址:https://www.cnblogs.com/scau20110726/p/2712640.html
Copyright © 2011-2022 走看看