题意:输入一个树状天平,根据力矩相等原则判断是否平衡。如图6-5所示,所谓力矩相等,就是W1D1 = W2D2,其中W1和W2分别为左右两边砝码的重量,D1和D2为距离。
采用递归方式输入:每个天平的格式为W1,D1,W2,D2,当W1或W2为0时表示该“砝码”实际是一个子天平,接下来绘描述这个子天平,接下来绘描述这个子天平。当W1=W2=0时,会先描述左子天平,然后是右子天平。
思路:所有天平都平衡该天平才平衡,天平平衡为左子天平的力矩等于右子天平的力矩,一个天平的重为所有子天平的重量和,所以采取传引用的方式,方便累加子天平的重量。
#include<bits/stdc++.h>
using namespace std;
bool solve(int& W)
{
int W1, D1, W2, D2;
scanf("%d%d%d%d", &W1, &D1, &W2, &D2);
bool b1 = true, b2 = true;
if (!W1) b1 = solve(W1);
if (!W2) b2 = solve(W2);
W = W1 + W2;
return b1 && b2 && (W1 * D1 == W2 * D2);
}
int main()
{
int T, W; scanf("%d", &T);
while(T--)
{
if (solve(W)) printf("YES\n");
else printf("NO\n");
if (T) printf("\n");
}
return 0;
}
/*
1
0 2 0 4
0 3 0 1
1 1 1 1
2 4 4 2
1 6 3 2
*/