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