欢迎访问我的Uva题解目录哦 https://blog.csdn.net/richenyunqi/article/details/81149109

题目描述

例题6-9 天平(Not so Mobile, UVa 839)

题意解析

输入一个树状天平,根据力矩相等原则判断是否平衡。如图6-5所示,所谓力矩相等,就是WlDl=WrDr,其中Wl和Wr分别为左右两边砝码的重量,D为距离。
采用递归(先序)方式输入:每个天平的格式为Wl,Dl,Wr,DrWl, Dl, Wr, Dr,当Wl=0Wl=0Wr=0Wr=0时,表示该“砝码”实际是一个子天平,接下来会描述这个子天平。当Wl=Wr=0Wl=Wr=0时,会先描述左子天平,然后是右子天平。

算法设计

这道题目的输入就采取了递归方式定义,因此编写一个递归过程进行输入比较自然。事实上,在输入过程中就能完成判断。一个天平的总重量是其左右子天平重量之和,可以在递归的过程中求出Wl,WrWl, Wr,并进行判断。

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;
}

相关文章:

  • 2022-12-23
  • 2021-08-25
  • 2021-08-04
  • 2022-01-13
  • 2021-11-24
猜你喜欢
  • 2021-06-12
  • 2021-07-13
  • 2021-12-27
  • 2021-06-19
  • 2021-12-01
相关资源
相似解决方案