题意:这是一个类似于树的天平,这个天平的每一端都有可能由一个子天平构成,而每个天平都满足一个公式 WL * DL = WR * DR,其中WL,WR分别代表左边和右边物品的重量,DL,DR分别代表左边和右边物品里天平中心的距离。
输入分析:对于每个输入的四个数,如果WL或WR为0时,则代表接下来的输入代表子天平的数据,如果WL和WR同时为0,则输入数据先描述左子天平的状态,其次是右子天平。
要求:判断该数据是否可以构成一个平衡的天平。
思路:根据这个天平的描述,我很自然的想到了递归,有点类似于二叉树的后续遍历。对每一个子天平都需判断是否能够构成平衡,只要有一个不行,就需要输出“NO”;否则输出“YES”。
/*
UvaOJ 839
Emerald
Thu 28 May 2015
*/
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
bool isEqual; // means the status is equal
int Moblie() {
int leftWeight, leftDis, rightWeight, rightDis;
scanf( "%d%d%d%d", &leftWeight, &leftDis, &rightWeight, &rightDis );
leftWeight = leftWeight == 0 ? Moblie() : leftWeight;
rightWeight = rightWeight == 0 ? Moblie() : rightWeight;
if( leftWeight * leftDis != rightWeight * rightDis ) {
isEqual = false;
}
return leftWeight + rightWeight;
} // return the totalWeight
int main() {
int T;
cin >> T;
while( T -- ) {
isEqual = true;
Moblie();
printf("%s\n", isEqual ? "YES" : "NO" );
if( T != 0 ) {
printf("\n");
}
}
return 0;
}