`
king_tt
  • 浏览: 2260647 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

UVa 10562 - Undraw the Trees (不限制儿子个数的树)

 
阅读更多

FILE 10562-Undraw the Trees 2073
29.14%
552
85.69%
题目链接:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=104&page=show_problem&problem=1503


题目类型: 数据结构, 二叉树



输入与输出:

Sample Professor’s TreesCorresponding Our Trees

2

A

|

--------

BCD

||

----- -

EF G

#

e

|

----

f g

#

(A(B()C(E()F())D(G())))

(e(f()g()))



题目大意:

左边的输入表示的是一棵树, 这棵树的一个结点可以有很多个儿子。所有的输入, 只要是可打印的字符,并且不是空格, ‘#’,’|‘, ’-‘的都是代表一个节点。

如果一个结点下方有‘|’则代表他有儿子。他的儿子们在一段连续‘-’的下面的结点。



分析与总结:

如果用建树的方法,初看可能比较复杂, 但是其实是很并不难的。我的方法是构造一个有MAXN个儿子指针的结点, 然后开一个和最大的输入尺寸一样的二维数组存结点,分别相对应

于输入的二维字符串数组。

然后对输出进行枚举,当碰到一个是结点的字符时,就对结点数组相对应结点找儿子, 找儿子用一个函数实现, 向下搜索出它的所有儿子即可。

最后构造完之后, 对这棵树进行前序遍历输出, 注意输出左右括号的位置。


按理说这题只要并不难的,但是却被恶心到了, 昨天晚上开始做的,想好思路后很快就敲好代码,过了样例之后自信满满的提交了,然后,看到了血红血红的Wrong answer,给了我当头一棒。之后就不断的调试,不断的WA。

然后就在网上找测试样例,结果发现也全部都可以过。这就说明一定不是我思路的问题, 肯定是一些细节或者边界条件没考虑到。


百度,谷歌被我翻了几十页,结果发现网上的解题报告全部都是用递归搜索解的,而且完全没有和我解题思路一样的。 更奇葩的是,我的队友也想了一个很奇葩的方法, 结果我们两个都卡了很久。


不断的WA,血淋淋的事实, 说明即使你认为自己是对的,确保是万无一失的, 也可能会有一些恶心的边界或者自己的思维漏洞而wa。


#include<cstdio>
#include<cctype>
#include<iostream>
#include<cstring>
#define MAXN 205
using namespace std;

class Node{
public:
    char data;
    Node *son[MAXN];
};

Node *root;
Node node[210][210];
char str[210][210];
int row;

inline bool isNode(char ch){
    if(isprint(ch) && ch!='-' && ch!='|' &&
            ch!=' ' && ch!='#')
        return true;
    return false;
}

void linkSon(int r, int c){
    if(r+3 >= row || str[r+1][c]!='|') return;
    int i,j;
    // 移动到有 ‘-’ 的最左边
    for(i=c; str[r+2][i]=='-'&&i>=0; --i) ;;
    int sonNum=0;
    i++;
    // 从最左边的‘-’往右枚举到最右边的'-'. 
    //这里特别要注意边界条件,就因为这个i<strlen(str[r+2])&&i<strlen(str[r+3])
    // 导致我郁闷了一个晚上+一个早上
    for( ; str[r+2][i]=='-'&&i<strlen(str[r+2])&&i<strlen(str[r+3]); ++i){
        if(isNode(str[r+3][i])){ // 如果是结点,链接起来
            node[r][c].son[sonNum++] = &node[r+3][i];
        }
    }
}

void dfs(Node *root){
    if(root){
        printf("%c", root->data);
        bool flag = true;
        for(int j=0; j<MAXN; ++j){
            if(root->son[j]!=NULL){
                flag = false;
                if(j==0) printf("(");
                dfs(root->son[j]);
            }
        }
        if(flag) printf("()");
        else printf(")");
    }
}  
void Solve(){
    // 初始化
    for(int i=0; i<row; ++i){
        for(int j=0; j<strlen(str[i]); ++j){
            for(int k=0; k<MAXN; ++k)
                node[i][j].son[k] = NULL; 
        }
    }   
    root = NULL;
    for(int i=0; i< row; ++i){
        for(int j=0; j<strlen(str[i]); ++j){
            if(isNode(str[i][j])){
                if(root==NULL){
                    node[i][j].data = str[i][j];
                    root = &node[i][j];
                    linkSon(i,j);
                    break;
                }
                else{
                    node[i][j].data = str[i][j];
                    linkSon(i, j);
                }
            }
        }
    }   
    printf("(");
    dfs(root);
    printf(")\n");
}

int main(){
 //   freopen("input.txt", "r", stdin);
    int T;
    scanf("%d%*c", &T);
    while(T--){
        row=3;
        memset(str[2], 0, sizeof(str[2]));
        while(gets(str[row])){
            if(str[row][0]=='#') break;
            ++row;
            memset(str[row], 0, sizeof(str[row]));// 初始化,避免遗留上次的数据下来
        }
        Solve();
    }
    return 0;
}      


—— 生命的意义,在于赋予它意义。

原创http://blog.csdn.net/shuangde800By D_Double






分享到:
评论

相关推荐

    UVaOJ-401(Palindromes).zip_401 Palindromes

    标题中的"UVaOJ-401(Palindromes)"表明这是一个关于解决UVa Online Judge(UVa OJ)上编号为401的编程挑战,该挑战的主题是"Palindromes",即回文串。回文串是指一个字符串无论从前读到后还是从后读到前都是相同的,...

    Uva 1510 - Neon Sign

    对于第二个测试用例,输出为0,因为不存在任何同色三角形。 #### 总结 本题主要考察了遍历和比较的能力,以及如何高效地处理大量数据。通过上述方法,我们可以有效地解决Uva 1510 - Neon Sign问题,并得出正确的...

    uva705-Slash-Maze-.rar_Slash_uva705

    【标题】"uva705-Slash-Maze-.rar_Slash_uva705" 指向的是一个在UVa Online Judge (UVa OJ) 上提交并通过的编程问题,具体为问题编号705,名为"Slash Maze"。这个压缩包很可能包含了该问题的解决方案源代码。 ...

    UVA100~200---52道题accept代码,均顺利accept过

    关键在于构建一个二维数组,存储每个位置到达的方法数。 2. **UVA191 - Darts**:此题涉及概率计算,需要计算投掷飞镖在圆形靶上的得分分布。理解和应用圆的几何性质以及概率论是解决此题的关键。 3. **UVA131 - ...

    开源项目-codingsince1985-UVa#uva-online-judge-solutions-in-golang.zip

    开源项目-codingsince1985-UVa#uva-online-judge-solutions-in-golang.zip,两年来每天都在解决一个uva在线裁判问题,算起来…

    UVA133-TheDoleQueue.zip_site:www.pudn.com_uva133

    UVA(University of Virginia)在线判题系统提供了丰富的算法题目供程序员挑战,其中编号为133的"The Dole Queue"(救济金发放问题)是一个典型的算法问题,旨在测试程序员对优先级队列(Priority Queue)的理解和...

    Algorithm-UVA-Solutions-in-Python.zip

    这个压缩包包含的"UVA-Solutions-in-Python-master"文件夹,很可能包含了各个分类的UVA问题的Python代码文件,如排序、搜索、图论、动态规划、回溯、贪心等经典算法的实例。每个问题的解决方案通常由一个或多个...

    uva532-Dungeon-Master.rar_dungeon

    在计算机科学与编程领域,UVA(University of Virginia)在线判题系统是一个深受程序员喜爱的平台,它提供了丰富的算法题目供学习者挑战。其中,编号为532的"Dungeon Master"题目是一个关于策略和计算的迷宫游戏,其...

    tpcw-nyu-uva-client 客户端

    使用tpcw-uva-client进行性能测试时,用户可能需要配置一系列参数,包括但不限于数据库连接参数、工作负载配置、并发用户数、测试持续时间等。测试结果可以帮助识别系统瓶颈,优化数据库配置,提升系统整体性能。 ...

Global site tag (gtag.js) - Google Analytics