天平(Not so Mobile, Uva 839)

题目

  • 参考网址:https://vjudge.net/problem/UVA-839
  • 大意:
    根据干杠平衡原理,判断题目所给出的数据组成的天平能否平衡。注意,此天平可能包含子天平。输入时,如果w为0,则表示包含子天平,子天平按照先左后右的方法输入。(书上感觉没有解释清楚,如果子天平不平衡则整个天平是不平衡的)

知识点

  • 递归遍历二叉树

思路

这题就是考遍历二叉树,难度不大,一开始写的相对紫书作者写的复杂咯。输入相当于就是一个先序遍历,遇到wl或者wr为0,说明有子树,向下递归,直到wl或者wr不为0,到达叶子节点。每次递归返回 left_ok && right_ok && (wl * dl == wr * dr),如果子天平不平衡那么父天平也不平衡。

代码

# include <cstdio>
using namespace std;

bool fun(int & w) {
    bool left_ok = true, right_ok = true;  // 天平左右端初始化平衡
    int wl, dl, wr, dr;
    scanf("%d %d %d %d", &wl, &dl, &wr, &dr);
    if(!wl)  // 为0,有子天平
        left_ok = fun(wl);  // 递归 -> 子天平
    if(!wr)  // 为0,有子天平
        right_ok = fun(wr);  // 递归 -> 子天平

    w = wl + wr;  // 引用,将父天平左/右端的weight设置为子天平两端之和
    return left_ok && right_ok && (wl * dl == wr * dr);
}

int main() {
    int n = 1,w = 0;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        if (fun(w))  // true
            printf("YES");
        else  // false
            printf("NO");
    }
    return 0;
}

过程中遇到的问题 & 解决

  • 作者巧妙地用了“&”引用(我是没想到的!秒啊!),这样的话直接可以将将父天平左/右端的weight赋值为子天平两端之和
  • 作者提示:题目比较抽象,可以画个示意图

测试

输入:

1
0 2 0 4
0 3 0 1
1 1 1 1
2 4 4 2
1 6 3 2

结果:

YES
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值