UVa 10562 (特殊的输入处理方式) Undraw the Trees

题意:

给出一个二维字符数组,它代表了一棵树。然后将这棵树转化为括号表示法(以递归的形式)。

分析:

这道题最大的特色就是对数据的处理方式,里面用到了一个 fgets() 函数,这个函数的功能有点像c++里面的cin.getline()

函数介绍:

从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行

 

学习一下对输入数据的细节处理。

 1 //#define LOCAL

 2 #include <cctype>

 3 #include <cstdio>

 4 #include <cstring>

 5 using namespace std;

 6 

 7 const int maxn = 200 + 10;

 8 int n;

 9 char buf[maxn][maxn];

10 

11 void dfs(int r, int c)

12 {

13     printf("%c(", buf[r][c]);

14     if(r+1 < n && buf[r+1][c] == '|')

15     {

16         int i = c;

17         while(i-1 >= 0 && buf[r+2][i-1] == '-')    i--;    //找"---"的左边界 

18         while(buf[r+2][i] == '-' && buf[r+3][i] != '\0')    //‘\0’不满足isspace 

19         {

20             if(!isspace(buf[r+3][i]))    dfs(r+3, i);    //换行符也同样满足isspace 

21             i++;

22         }

23     }

24     printf(")");

25 }

26 

27 void solve()

28 {

29     n = 0;

30     for(;;)

31     {

32         fgets(buf[n], maxn, stdin);

33         if(buf[n][0] == '#')    break;

34         else n++;

35     }

36     printf("(");

37     if(n)

38     {

39         for(int i = 0; i < strlen(buf[0]); ++i)

40             if(buf[0][i] != ' ')

41             {

42                 dfs(0, i);

43                 break;

44             }

45     }

46     printf(")\n");

47 }

48 

49 int main(void)

50 {

51     #ifdef LOCAL

52         freopen("10562in.txt", "r", stdin);

53     #endif

54 

55     int T;

56     fgets(buf[0], maxn, stdin);

57     sscanf(buf[0], "%d", &T);

58     while(T--)    solve();

59 

60     return 0;

61 }
代码君

 

你可能感兴趣的:(tree)