算法竞赛入门经典 UVA 839 天平树

本文介绍了一种使用递归算法解决树状天平平衡问题的方法。通过输入天平的结构,利用力矩相等原则判断整个天平系统是否平衡。代码采用C++实现,详细解释了解题思路和AC代码。

题目链接
题目大意:
输入一个树状天平,根据力矩相等原则(力臂乘质量)判断是否平衡。所谓力矩相等,就是w1d1=w2d2。按照递归(先序)方式输入,每个天平的格式为w1,d1,w2,d2,若输入的W(质量)为0,则说明该“砝码”是个子天平,接下来会描述该子天平。

Sample Input
1
0 2 0 4
0 3 0 1
1 1 1 1
2 4 4 2
1 6 3 2
Sample Output
YES
在这里插入图片描述

解题思路:
输入采用了递归的方式,我们也很自然想到递归处理。父天平两边的重量是子天平砝码的质量总和,因此我们可以采用引用传值来修改左右子天平的重量。

AC代码:

#include<iostream>
#include<stdio.h>
using namespace std;
bool solve(int &w) {//引用传值
	int w1, d1, w2, d2;
	bool b1 = true, b2 = true;//用于判断左右子树是否平衡
	cin >> 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 t, tmp = 0;
	cin >> t;
	while (t--) {
		if (solve(tmp))cout << "YES\n";//首次调用solve函数传入的参数没有实际意义
		else cout << "NO\n";
		if (t)cout << "\n";//此处是因为输入格式的要求
	}
	//system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值