1. 程式人生 > >UVA10562(看圖寫樹,dfs)

UVA10562(看圖寫樹,dfs)

找到 str style har 真的 應該 cst urn double

這個題過的好艱難,不過真的學到好多。

關於fgets的用法真的是精髓。!isspace(c)和c!=‘ ‘是有區別的。

其它的看代碼吧

 1 #include <iostream>
 2 #include <cstring>
 3 #include <string>
 4 #include <map>
 5 #include <set>
 6 #include <algorithm>
 7 #include <fstream>
 8 #include <cstdio>
 9
#include <cmath> 10 #include <stack> 11 #include <queue> 12 #include <cctype> 13 14 using namespace std; 15 const double Pi=3.14159265358979323846; 16 typedef long long ll; 17 const int MAXN=200+5; 18 const int dx[5]={0,0,0,1,-1}; 19 const int dy[5]={1,-1,0,0,0}; 20 const int
INF = 0x3f3f3f3f; 21 const int NINF = 0xc0c0c0c0; 22 const ll mod=1e9+7; 23 char buf[MAXN][MAXN]; 24 int n; 25 void dfs(int i,int c) 26 { 27 printf("%c(",buf[i][c]); 28 //準備向下遞歸 29 if(i+1<n&&buf[i+1][c]==|) 30 { 31 int r=c; 32 //很巧妙的地方,只用找到左邊界就可以了,以為它一直是有‘-‘的,所以一定知道右邊界在哪
33 while(r-1>=0&&buf[i+2][r-1]==-) {r--;} 34 while(buf[i+2][r]==-&&buf[i+3][r]!=\0) 35 { 36 if(!isspace(buf[i+3][r])) dfs(i+3,r); 37 r++; 38 } 39 } 40 printf(")"); 41 } 42 43 void solve() 44 { 45 n=0; 46 while(1) 47 { 48 fgets(buf[n],MAXN,stdin); 49 if(buf[n][0]==#) break; 50 else n++; 51 } 52 53 printf("("); 54 if(n) 55 { 56 //這一步應該是從根開始遞歸,因為只有一個根,所以只需要遞歸一次 57 for(int i=0;i<strlen(buf[0]);i++) 58 { 59 if(buf[0][i]!= ) 60 { 61 dfs(0,i); 62 break; 63 } 64 } 65 } 66 printf(")\n"); 67 } 68 69 int main() 70 { 71 int t; 72 cin>>t;cin.get(); 73 while(t--) 74 { 75 solve(); 76 } 77 return 0; 78 }

UVA10562(看圖寫樹,dfs)