UVa 839 Not so Mobile

题意:给出一个树状天平,判断其是否平衡

学习的紫书:采用递归先序输入,每个天平的格式为w1,d1,w2,d2,当w1,w2为0的时候,输入的是一个子天平。

这样每当输入一个子天平的时候,返回子天平是否平衡,同时用的是&w值传递,每次调用solve函数,w的值也会改变,就一层一层子天平的判断

 

递归理解起来还是很吃力,然后手推了一下样例,然后又打印中间的值来看,稍微理解一丢丢了= =

 1 #include<iostream>  

 2 #include<cstdio>  

 3 #include<cstring> 

 4 #include <cmath>   

 5 #include<algorithm>  

 6 using namespace std;

 7 

 8 typedef long long LL;

 9 

10 bool solve(int &w){

11     int w1,w2,d1,d2;

12     bool b1=true,b2=true;

13     cin>>w1>>d1>>w2>>d2;

14     if(!w1) b1=solve(w1);

15     if(!w2) b2=solve(w2);

16     w=w1+w2;

17 //    printf("b1=%d\n",b1);

18 //    printf("b2=%d\n",b2);

19 //    printf("w=%d\n",w);

20     return b1&&b2&&(w1*d1==w2*d2);

21 }

22 

23 int main()

24 {

25     int t,w;

26     cin>>t;

27     while(t--){

28         if(solve(w)) printf("YES\n");

29         else printf("NO\n");

30         if(t) printf("\n");

31     }

32     return 0;

33 }
View Code

 

你可能感兴趣的:(mobile)