树--天平问题
题目:
输入一个树状天平,根据力矩相等的原则判断是否平衡。(力矩相等:W1D1 = W2D2)
输入:
采用递归输入:每个天平的格式为w1,d1,w2,d2 ,当w1或w2为0时,表示改砝码是一个子天平。当w1,w2为0时,先描述左子天平,然后描述右子天平
例:
1
0 2 0 4
0 3 0 1
1 1 1 1
2 4 4 2
1 6 3 2
输出:
“YES”或“NO”(输入样例正确输出为“YES”)
既然是递归输入,那就顺着他递归去动态输入然后判断就好了。。
如果输入当前w1为0,说明它下面有子天平,就递归到下一层,直到w1不再为0,判断,返回是否正确,如此一步步递归最后得出结果。很容易看出,下面程序里的return,返回的是当前步的结果和上一步的结果,如果天平中有一个天平不平衡,那么以上所有的返回就都是false,到最后直接判断输出就好了。。
//天平(Not so Mobile, UVa 839)
#include<iostream>
#include<cstdio>
using namespace std;
bool solve(int& w)
{
int w1, d1, w2, d2;
bool b1 =true, b2 = true;
cin >> w1 >> d1 >> w2 >> d2;
if(!w1) b1 = solve(w1);//如果有子天平就递归下去
if(!w2) b2 = solve(w2);//同上
w = w1 + w2;
return b1 && b2 && (w1 * d1 == w2 * d2);/*这里的&&顺便返回了上一步的正确与否的状态,所以只要一步是false,所有返回就都为false*/
}
int main()
{
int t, w;
cin >> t;
while(t--){
solve(w) ? cout<<"YES\n" : cout<<"NO\n";
if(t) cout<<'\n';
}
return 0;
}