【DFS】UVa10562 - Undraw the Trees
题意
将多叉树转化成括号表示法,每个非叶结点的正下方有一个“|”,再下方是一排“-”,恰好覆盖所有子节点的上方
思路
一行行读入,从根节点开始找起,dfs遍历
总结
以下代码WA=。= 改成书上那种写法才AC。但是仍不明白为什么
while(cin.getline(s[n],maxn))
if(s[n++][0] == '#') break;
...
...
void dfs(...)
{
...
if(s[r+1][0] != '#' && s[r+1][c] == '|')
...
}
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int maxn = 205; 7 char s[maxn][maxn]; 8 int T, n; 9 void dfs(int r, int c) 10 { 11 cout << s[r][c] << "("; 12 if(r+1 < n && s[r+1][c] == '|' ){ 13 int i = c; 14 for(i = c; i-1 >= 0; i--) 15 if(s[r+2][i-1] != '-') break; 16 for(;s[r+2][i] == '-' && s[r+3][i] != '\0';i++) 17 if(!isspace(s[r+3][i])) dfs(r+3, i); 18 19 } 20 cout << ")"; 21 } 22 int main() 23 { 24 // freopen("in.txt","r",stdin); 25 cin >> T; 26 getchar(); 27 while(T--){ 28 n = 0; 29 memset(s, 0, sizeof s); 30 while(cin.getline(s[n],maxn)) 31 if(s[n][0] == '#') break; 32 else n++; 33 cout << "("; 34 if(n){ 35 int len = strlen(s[0]); 36 for(int i = 0; i < len; i++) 37 if(s[0][i] != ' ') 38 dfs(0, i); 39 cout << ")" << endl; 40 } 41 return 0; 42 }

浙公网安备 33010602011771号