欢迎访问我的Uva题解目录哦 https://blog.csdn.net/richenyunqi/article/details/81149109
题目描述
题意解析
输入一个树状天平,根据力矩相等原则判断是否平衡。如图6-5所示,所谓力矩相等,就是WlDl=WrDr,其中Wl和Wr分别为左右两边砝码的重量,D为距离。
采用递归(先序)方式输入:每个天平的格式为,当或时,表示该“砝码”实际是一个子天平,接下来会描述这个子天平。当时,会先描述左子天平,然后是右子天平。
算法设计
这道题目的输入就采取了递归方式定义,因此编写一个递归过程进行输入比较自然。事实上,在输入过程中就能完成判断。一个天平的总重量是其左右子天平重量之和,可以在递归的过程中求出,并进行判断。
C++代码
#include<bits/stdc++.h>
using namespace std;
struct Node{
int Wl,Dl,Wr,Dr;//数据域
Node*left=nullptr,*right=nullptr;//左右孩子指针
};
int DFS(Node*&root,bool&f){//深度优先遍历
root=new Node();
scanf("%d%d%d%d",&root->Wl,&root->Dl,&root->Wr,&root->Dr);
if(root->Wl==0)//Wl是0
root->Wl=DFS(root->left,f);//递归建立左子天平
if(root->Wr==0)//Wr是0
root->Wr=DFS(root->right,f);//递归建立右子天平
if(root->Dl*root->Wl!=root->Dr*root->Wr)//左右力矩不相等
f=false;//置f为false
return root->Wl+root->Wr;//返回整个天平重量
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;++i){
Node*root=nullptr;
bool f=true;
DFS(root,f);
printf("%s%s\n",i>0?"\n":"",f?"YES":"NO");
}
return 0;
}