I - 天平 (p157,二叉树的 DFS) UVA - 839

题目

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

样例输入:

1
0 2 0 4
0 3 0 1
1 1 1 1
2 4 4 2
1 6 3 2

输出
YES

我还是按照上一节数组记录结点的方法做,用递归dfs

#include<cstdio>

using namespace std;
const int maxn=100000+10;
int cnt=0;
int lft[maxn],rht[maxn],m[maxn],l_lft[maxn],l_rht[maxn],m_lft[maxn],m_rht[maxn];

int input (){
    cnt++;
    int root=cnt,lm,rm;
    scanf("%d%d%d%d",&lm,&l_lft[root],&rm,&l_rht[root]);
    if(lm==0){lft[root]=input(); lm=m[lft[root]];}
    else lft[root]=0;
    if(rm==0){rht[root]=input(); rm=m[rht[root]];}
    else rht[root]=0;
    m_lft[root]=lm;
    m_rht[root]=rm;
    m[root]=lm+rm;
    //printf("m_left [%d]=%d ",root,m_lft[root]=lm);
    //printf("m_right [%d]=%d ",root,m_rht[root]=rm);
    //printf("m[%d]=%d",root,m[root]=lm+rm);
    return root;
}

bool dfs(int root){
    bool yes=false;
    if(l_lft[root]*m_lft[root]==l_rht[root]*m_rht[root]){
    if(lft[root]) if(!dfs(lft[root]))return yes;
    if(rht[root]) if(!dfs(rht[root]))return yes;
    yes= true;
    }
    return yes;
}

int main(){
    int T; scanf("%d",&T);
    while(T--){
        cnt=0; input();
        if(dfs(1)) printf("YES\n");
        else printf("NO\n");
        if(T)pritnf("\n");
    }
    return 0;
}

书上:

如果树的输入过程采用递归输入,则中就能完成递归判断,利用引用传值,可以非常精简。

本题如是

//lrj的精简版本
#include<iostream>

using namespace std;

bool solve(int &M){
    int m1,m2,l1,l2;
    bool b1=true,b2=true;
    cin>>m1>>l1>>m2>>l2;
    if(!m1)b1=solve(m1);
    if(!m2)b2=solve(m2);
    M=m1+m2;
    return b1&&b2&&(m1*l1==m2*l2);
}

int main(){
    int M,T;
    cin>>T;
    while(T--){
      if(solve(M))cout<<"YES"<<endl;
      else cout<<"NO"<<endl;
      if(T) cout<<endl;
    }
    return 0;
} 

非常精简;

注: · 两组数据用空行隔开,最后一组后没有空行

所以:

while(T--){
if (T) cout<<endl;
if (T) printf("\n");
}

原文地址:https://www.cnblogs.com/-ifrush/p/10201856.html

时间: 2024-10-12 15:03:20

I - 天平 (p157,二叉树的 DFS) UVA - 839的相关文章

天平 (Not so Mobile UVA - 839)

题目描述: 题目思路: 1.DFS建树 2.只有每个树的左右子树都平衡整颗树才平衡 1 #include <iostream> 2 using namespace std; 3 4 bool solve(int& w) 5 { 6 int d1,w1,d2,w2; 7 cin >> w1 >> d1 >> w2 >> d2 ; 8 bool b1 = true ,b2 = true ; 9 if(!w1) b1 = solve(w1) ;

[2016-02-09][UVA][839][Not so Mobile]

时间:2016-02-09 12:10:40 星期二 题目编号:UVA 839 题目大意:给定一个秤,已知秤两边的重量和到支点的距离,问秤能否平衡 分析:每个秤都是一个树的结构,只需要遍历一遍,看每个分支点能否平衡即可 方法:根绝输入,dfs下去,判断每个节点是否平衡即可 解题过程遇到问题: 刚开始,不平衡,返回值设置成0,没考虑为0的情况,不平衡的时候 改成返回-1就AC了. 刚开始忘记输出每组数据之间的空行 这里写法把整棵树都遍历了一遍,事实上,当出现不平衡的点,读取完数据之后,就可以直接返

给定一个二叉树的dfs遍历结果(NULL记为*),重构二叉树,返回头节点

给定一个二叉树的dfs遍历结果(NULL记为*),重构二叉树,返回头节点. 思路:第一遍先把*也插入到树中,第二遍把*改成NULL. 如果直接把*记录为NULL,那再来一个节点就不知道,到底是*赋值的NULL,还是本身自带的NULL. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 struct TreeNode{ 5 char val; 6 TreeNode* left; 7 TreeNode* right; 8 TreeNode(

Uva 839天平(二叉树dfs, 递归建树)

题意: 给定一个天平长度 输入格式为 wl dl wr dr 分别代表天平左边长度,左边重量, 右边长度, 右边重量. 如果重量为0, 说明下面还有一个天平, 递归给出. 样例输入:10 2 0 40 3 0 11 1 1 12 4 4 21 6 3 2 如果天平是左右重量相等的 输出YES 否则输出NO. 分析: 既然以递归的定义输入, 那么我们程序最好写成递归建树,如果有重量是0, 那么就递归建左子树或者右子树 , 如果是叶子节点的父节点(这个天平下面没天平), 那么就判断左右是否相等返回即

UVa 839 天平

原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=780 先建立二叉树,之后遍历. 1 #include<iostream> 2 using namespace std; 3 4 struct Node 5 { 6 int W1, D1, W2, D2; 7 Node *left; 8 Node *right; 9 };

UVa 12166(字符型二叉树的dfs)

一.题目 [PDF Link] A mobile is a type of kinetic sculpture constructed to take advantage of the principle of equilibrium. It consists of a number of rods, from which weighted objects or further rods hang. The objects hanging from the rods balance each o

UVa 839 (递归方式读取二叉树) Not so Mobile

题意: 递归的方式输入一个树状天平(一个天平下面挂的不一定是砝码还可能是一个子天平),判断这个天平是否能满足平衡条件,即W1 * D1 == W2 * D2. 递归的方式处理输入数据感觉很巧妙,我虽然能理解,但自己是写不出来的. 这里的参数是传引用,所以是在递归回来的时候才会赋值的. 1 //#define LOCAL 2 #include <iostream> 3 using namespace std; 4 5 bool solve(int& w) 6 { 7 int w1, d1

UVA 839 Not so Mobile (递归建立二叉树)

题目连接:http://acm.hust.edu.cn/vjudge/problem/19486 给你一个杠杆两端的物体的质量和力臂,如果质量为零,则下面是一个杠杆,判断是否所有杠杆平衡. 分析:递归.直接递归求解即可. #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climit

6_9 天平(UVa839)&lt;二叉树的DFS&gt;

前一个ubiquous通信小工具,移动只是一个由弦和电线组成的结构五彩缤纷的东西.这种移动通常被发现悬挂在小婴儿的摇篮.图说明了一个简单的移动.它只是一个电线,悬挂的一个字符串,每一个对象的对象.它可以也被看作是一种杠杆的支点上的字符串的字符串联系的电线.从杠杆原理,我们知道,要平衡一个简单的移动的对象的重量的产品他们距离支点必须相等.这是WL×DL = WR×DR,DL是左边的距离DR是右边的距离,WL是左边的重量和WR是右边的重量.在一个更复杂的移动的对象可能被替换由一个子移动,如下图所示.