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 }