题意:输入一个树状天平,根据力矩相等原则判断是否平衡。所谓力矩相等:就是WlDl = WrDr ,其中Wl和Wr分别为左右俩边砝码的重量,D为距离。
输入时:当Wl或Wr为0时,表示该砝码实际是一个子天平,接下来会描述这个子天平。当Wl=Wr=0时,会先描述左天平,然后右天平。
思路:输入时就直接采用先序递归输入,每次返回值为判断左树,右树和本身天平是否都保持平衡!
代码:
#include <iostream>
#include <stdio.h>
using namespace std;
bool solve(int &W){
int W1,W2,D1,D2;
bool b1 = true,b2 = true;
scanf("%d%d%d%d",&W1,&D1,&W2,&D2);
if(!W1) b1 = solve(W1);//左树
if(!W2) b2 = solve(W2);//右树
W = W1 + W2;//求左右树相加
return b1 && b2 && (W1*D1 == W2*D2);//判断左右树和本树下是否平衡
}
int main()
{
int n,W;
while(scanf("%d",&n)!=EOF)
{
while(n--){
if(solve(W)) printf("YES\n");
else printf("NO\n");
if(n) printf("\n");
}
}
return 0;
}