题意:
输入一个树状的天平,根据力矩相当原则判断是否平衡,也就是W1*D1=W2*D2 ,其中W是砝码的重量,D是力矩。采用递归先序的
方式输入,每个天平的格式为W1,D1 W2,D2 当W1,W2 为0的时候,表示该天平实际上是一个子天平,接下来会描述子天平,当
W1=W2 =0时,会先描述左子天平,然后是右子天平。
input:
1
0 2 0 4
0 3 0 1
1 1 1 1
2 4 4 2
1 6 3 2
output:
YES
分析:
解决这样的题目之前,首先要理解题目的意思,当然这是对于新手来说的,首先将测试样例在纸上画出来,确保正确理解输入格
式。在这里有个小建议:当遇到题目比较复杂的时候,建议先手算样例或者至少把样例的图示画出来,以免误解题意。本题的输入
是采用的递归方式定义,因此需要根据题意编写一个递归过程进行输入,事实上,再输入的过程中就可以进行平衡的判断,可以
使用引用传值。
代码:
#include <bits/stdc++.h>
using namespace std;
//输入一个子天平并判断子天平是否平衡,参数W修改子天平的总重量
bool slove(int &W) //递归输入,并进行判断
{
int w1,w2,d1,d2;
bool f1=true,f2=true;
cin >>w1>>d1>>w2>>d2;
if(!w1)
f1=slove(w1);
if(!w2)
f2=slove(w2);
W=w1+w2;
return f1&&f2&&(w1*d1==w2*d2);
}
int main()
{
int t,w;
cin >>t;
while(t--)
{
if(slove(w))
cout <<"YES."<<endl;
else
cout <<"NO."<<endl;
}
cout <<endl;
return 0;
}
小结:本题是二叉树的DFS,虽然简单但是极为重要,要经常回头看看本题,理解本题的意思。