紫书 第六章 例题 6-9
一、题目描述。
已知天平的平衡条件是:左侧重量 × 左侧力臂 = 右侧重量 × 右侧力臂,即
先输入一个数代表测试组数,一个组有若干行,每行有四个整数,分别是上式的 WL 、DL 、WR 、DR 。如果 WL = 0 ,代表该天平左侧连接着一个子天平,天平左侧的重量为子天平的重量(仅计左右两侧物体的重量)下面一行需要再输入四个数,直到 WL 、 WR ≠ 0 。对 WR 同理 。
如果天平及其子天平都平衡,输出 YES ,否则输出 NO 。每两组测试之间要空一行。
二、算法分析与代码编写指导
本算法与紫书上的算法相同,只是优化了代码。
先写主程序,保留判断是否平衡的函数 IsEquil ,主程序的大致框架是:调用函数判断平衡输出 YES ,否则输出 NO 。
然后写 IsEquil 函数。传入参数是子天平的总重 W 。在主程序中调用时,该参数没有对应的物理意义。只有当 WL 或 WR = 0 时,递归调用该函数,才会将 W 修改为子天平的重量。调用函数时,新建 4 个变量 w1, d1, w2, d2 ,以及两个 bool 值记录左右子天平是否平衡。当 w1 或 w2 = 0 时,才递归调用该函数,传入参数分别写 w1 和 w2 ,这样在返回到本层函数时,本层函数中相应的左边重量或右边重量的值就已经被修改,程序也会根据子天平的重量来判断是否平衡。
三、AC 代码 (紫书原代码约 60 或 70 或 80 ms ,本代码约 20 ms)
#include<cstdio>
#pragma warning(disable:4996)
unsigned int T, w