Uva 839 Not so Mobile

题意:这是一个类似于树的天平,这个天平的每一端都有可能由一个子天平构成,而每个天平都满足一个公式 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;
}

 

posted @ 2015-05-28 21:57  Emerald  阅读(480)  评论(0编辑  收藏  举报