UVA839 天平 Not so Mobile
因为这个solve函数使用的是引用变量&w,在函数里对w(形参)的改变会直接改变实参,wl,wr通过递归走到根节点并得到根节点的质量返回,一层递归结束以后wl,wr的值已经改变了,最后回来w就已经是总质量了,返回的时候就一层一层地比较了是否平衡
#include<bits/stdc++.h>
using namespace std;
#define debug(x) cout<<"# "<<x<<" "<<endl;
typedef long long ll;
const ll mod=2147483647;
const ll N=1e5+7;
/*输入一个子天平,返回子天平是否平衡,参数w修改子天平的总重量*/
bool solve(ll &w)
{
ll wl,wr,dl,dr;
bool bl=true,br=true;
cin>>wl>>dl>>wr>>dr;
if(!wl)bl=solve(wl);
if(!wr)br=solve(wr);
w=wl+wr;//通过引用变量来计算此天平的总重量并修改w的值以传回答案;
return bl&&br&&(wl*dl==wr*dr);//如果当前的天平是平衡的且其子树(如果有的话)也是平衡的,那么这整棵树都是平横的
}
ll t,w;
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
//read(t);
cin>>t;
while(t--)
{
if(solve(w))cout<<"YES"<<endl;
else cout<<"NO"<<endl;
if(t)cout<<endl;
}
return 0;
}
有任何疑问欢迎评论哦虽然我也很菜