UVA

/*
  此题代码看似极其简短,但要理解,还是需要想比较久,考虑清楚代码的真正含义。
  
  值得重做,对于递归的理解很有帮助!
  
  该题最重要的部分是,递归输入;并且运用引用,使得在输入时,便可完成平衡的判断
  
  这题的引用的使用是否巧妙,值得好好体会,时不时重看!
*/


#include <iostream>
using namespace std;

//输入一个子天平,返回天平是否平衡,参数W修改为子天平的总重量
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; //其实如果只考虑最上层的天平,这步似乎没什么意义;但其实它的意义在于,在当前是递归到一个子天平的情况时,就要重新输入子天平所在处的左右天平,如果有了这句代码,参数 W1 或者 W2,最终就能变为子天平上的两个左右天平的总重量。如此,等到判断 D1 * W1 == D2 * W2时,W1 和 W2就都不会是0了,而是该子天平下所有子天平的总重量(如果有的话,没有子天平,就还是它本身的质量,总之不会是0,而是它自己或是自己所有子天平的重量) 
	return b1 && b2 && (W1 * D1 == W2 * D2);
}

int main()
{
	int T, W;
	cin >> T;
	while (T--)
	{
		if (solve(W)) cout << "YES" << endl;
		else cout << "NO" << endl;
		if (T) cout << endl;
	}
	return 0;
}


原文地址:https://www.cnblogs.com/mofushaohua/p/7789401.html