您的位置:首页 > 编程语言

UVA - 839 Not so Mobile

2017-09-23 23:56 344 查看
/*
此题代码看似极其简短,但要理解,还是需要想比较久,考虑清楚代码的真正含义。

值得重做,对于递归的理解很有帮助!

该题最重要的部分是,递归输入;并且运用引用,使得在输入时,便可完成平衡的判断

这题的引用的使用是否巧妙,值得好好体会,时不时重看!
*/


#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息