下面看一道名为天平的题目(Not si Mobile,UVa 839)
题目描述
输入一个树状天平,根据力矩相等的原则判断是否平衡。如图,所谓力矩相等,就是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

题目分析
这道题目的输入主要采用了递归方式定义,因此可以用一个递归程序来输入,同时在输入的同时完成判断。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <iostream>
using namespace std;
bool solve(int& W) {
int Wl, Dl, Wr, Dr;
bool b1 = true, b2 = true;
scanf("%d%d%D%D", &Wl, &Dl, &Wr, &Dr);
if(!Wl) b1 = solve(Wl);
if(!Wr) b2 = solve(Wr);
W = Wl + Wr;
return b1 && b2 && (Wl * Dl == Wr * Dr);
}
int main()
{
int T, W;
cin >> T;
while(T--) {
if(solve(W)) puts("YES\n");
else puts("NO\n");
if(T) puts("\n");
}
return 0;
}
|