输入一个树状天平,根据力矩相等原则判断是否平衡。如图6-5所示,所谓力矩相等就是 W1D1 = W2D2 ,其中 W1 和 W2 分别表示天平左右两边的砝码重量,D为距离。
采用递归方式输入,每个天平的格式为 W1, D1, W2, D2 当 W1 || W2 == 0时,表示砝码实际上是一个子天平,接下来会描述这个子天平,当 W1 = W2 = 0时,会先描述左子天平,然后再描述又子天平。
要点:
- 树状天平,且采用递归方式输入,因此采用递归方法解题
- 需要的东西是天平左边的质量以及左边如果是天平是否平衡,右边同理,最后判断该天平是否平衡,作为返回true的条件。
#include<bits/stdc++.h>
using namespace std;
bool solve(int& m) {
int W1, D1, W2, D2;
cin >> W1 >> D1 >> W2 >> D2;
bool left = true, right = true;
if(!W1) left = solve(W1); //看看左边是否平衡以及获得左边的质量
if(!W2) right = solve(W2); //看看右边是否平衡以及获得右边的质量
m = W1 + W2;
return left && right && (W1 * D1 == W2 * D2); //如果任一边不平衡或者这个天平本身不平衡,就是假
}
int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int T, m;
cin >> T;
while(T--) {
if(solve(m)) cout << "YES" << endl;
else cout << "NO" << endl;
if(T)
cout << endl;
}
}