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 };
10
11 bool flag;
12
13 Node* creatTree()
14 {
15     Node* root = new Node;
16     cin >> root->W1 >> root->D1 >> root->W2 >> root->D2;
17     if (root->W1 == 0)  root->left = creatTree();
18     else                root->left = NULL;
19     if (root->W2 == 0)    root->right = creatTree();
20     else                root->right = NULL;
21     return root;
22 }
23
24 int balance(Node* root)
25 {
26     if (flag == false)  return 0;
27     if (root->W1 == 0)   root->W1 = balance(root->left);
28     if (root->W2 == 0)     root->W2 = balance(root->right);
29     if (root->W1*root->D1 != root->W2*root->D2)  flag = false;
30     return(root->W1 + root->W2);
31 }
32
33 void remove_tree(Node* u)
34 {
35     if (u == NULL)  return;
36     remove_tree(u->left);
37     remove_tree(u->right);
38     delete u;
39 }
40
41 int main()
42 {
43     int t;
44     cin >> t;
45     while (t--)
46     {
47         Node* root = NULL;
48         flag = true;
49         root=creatTree();
50         flag = true;
51         balance(root);
52         if (flag == true)  cout << "YES" << endl;
53         else               cout << "NO" << endl;
54         remove_tree(root);
55         if (t != 0)   cout << endl;
56     }
57 }

刘汝佳的书上给出了一个引用传值的简单的方法

 1 #include<iostream>
 2 using namespace std;
 3
 4 bool solve(int &W)
 5 {
 6     int W1, D1, W2, D2;
 7     bool b1 = true, b2 = true;
 8     cin >> W1 >> D1 >> W2 >> D2;
 9     if (!W1)  b1 = solve(W1);
10     if (!W2)  b2 = solve(W2);
11     W = W1 + W2;
12     return b1&&b2 && (W1*D1 == W2*D2);
13 }
14
15 int main()
16 {
17     int T, W;
18     cin >> T;
19     while (T--)
20     {
21         if (solve(W))  cout << "YES" << endl;
22         else cout << "NO" << endl;
23         if (T)  cout << endl;
24     }
25     return 0;
26 }
时间: 2024-11-05 12:09:35

UVa 839 天平的相关文章

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, 那么就递归建左子树或者右子树 , 如果是叶子节点的父节点(这个天平下面没天平), 那么就判断左右是否相等返回即

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

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

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

题目 输入一个树状天平,根据力矩相等原则判断是否平衡.如图6-5所示,所谓力矩相等,就是WlDl=WrDr,其中Wl和Wr分别为左右两边砝码的重量,D为距离.采用递归(先序)方式输入:每个天平的格式为Wl,Dl,Wr,Dr,当Wl或Wr为0时,表示该"砝码"实际是一个子天平,接下来会描述这个子天平.当Wl=Wr=0时,会先描述左子天平,然后是右子天平. 样例输入: 10 2 0 40 3 0 11 1 1 12 4 4 21 6 3 2 输出YES 我还是按照上一节数组记录结点的方法做

天平 (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) ;

Uva 839 Not so Mobile

题意:这是一个类似于树的天平,这个天平的每一端都有可能由一个子天平构成,而每个天平都满足一个公式 WL * DL = WR * DR,其中WL,WR分别代表左边和右边物品的重量,DL,DR分别代表左边和右边物品里天平中心的距离. 输入分析:对于每个输入的四个数,如果WL或WR为0时,则代表接下来的输入代表子天平的数据,如果WL和WR同时为0,则输入数据先描述左子天平的状态,其次是右子天平. 要求:判断该数据是否可以构成一个平衡的天平. 思路:根据这个天平的描述,我很自然的想到了递归,有点类似于二

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(树的递归输入)

题意  判断一个树状天平是否平衡   每个测试样例每行4个数  wl,dl,wr,dr  当wl*dl=wr*dr时  视为这个天平平衡  当wl或wr等于0是  下一行将是一个子天平  如果子天平平衡  wl为子天平的wl+wr  否则整个天平不平衡 容易看出  输入是递归的  所以我们可以直接递归  边输入边判断 #include<cstdio> using namespace std; bool solve(int &w) { int wl, dl, wr, dr; bool m

UVa 1354 天平难题 (枚举二叉树)

题意: 分析: 其实刚看到这题的时候觉得很难, 以至于结束了第七章然后去做了一遍第六章树的部分.现在再做这题觉得思路并不是太难,因为总共就只有六个结点,那么只要枚举二叉树然后算出天平然后再从叶子往上推就能得出这棵树的宽度.这题我觉得主要难点是如何去枚举二叉树,其实这就是回溯法的核心.先去dfs选这个作为结点的, 然后还原, 再做不选的dfs, 这样就能没有遗漏(但会有重复)地枚举二叉树了. 这题还有个细节是一个天平中,左子树的右长度可能会超过天平右臂 + 右子树的长度, 如下图 那么就不能单纯地

UVa 1354 天平难题

首先呈现刘汝佳的高级代码 // UVa1354 Mobile Computing // Rujia Liu #include<cstdio> #include<cstring> #include<vector> using namespace std; struct Tree { double L, R; // distance from the root to the leftmost/rightmost point Tree():L(0),R(0) {} }; co