树--天平问题

题目:

  输入一个树状天平,根据力矩相等的原则判断是否平衡。(力矩相等:W1D1 = W2D2)

输入:

  采用递归输入:每个天平的格式为w1,d1,w2,d2 ,当w1或w2为0时,表示改砝码是一个子天平。当w1,w2为0时,先描述左子天平,然后描述右子天平

  例:

  1

  0 2 0 4

  0 3 0 1

  1 1 1 1

  2 4 4 2

  1 6 3 2

输出:

  “YES或“NO”(输入样例正确输出为“YES”)

既然是递归输入,那就顺着他递归去动态输入然后判断就好了。。

如果输入当前w1为0,说明它下面有子天平,就递归到下一层,直到w1不再为0,判断,返回是否正确,如此一步步递归最后得出结果。很容易看出,下面程序里的return,返回的是当前步的结果和上一步的结果,如果天平中有一个天平不平衡,那么以上所有的返回就都是false,到最后直接判断输出就好了。。

 

//天平(Not so Mobile, UVa 839)

#include<iostream>
#include<cstdio>

using namespace std;

bool solve(int& w)
{
	int w1, d1, w2, d2;
	bool b1 =true, b2 = true;
	cin >> w1 >> d1 >> w2 >> d2;
	if(!w1) b1 = solve(w1);//如果有子天平就递归下去
	if(!w2) b2 = solve(w2);//同上
	w = w1 + w2;
	return b1 && b2 && (w1 * d1 == w2 * d2);/*这里的&&顺便返回了上一步的正确与否的状态,所以只要一步是false,所有返回就都为false*/
}

int main()
{
	int t, w;
	cin >> t;
	while(t--){
		solve(w) ? cout<<"YES\n" : cout<<"NO\n";
		if(t) cout<<'\n';
	}
	return 0;
}

  

 

posted on 2016-03-07 17:43  张同学one  阅读(208)  评论(0编辑  收藏  举报