http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19486
我的代码:
#include<iostream>
#include<cstdio>
using namespace std;
int fun(int W,int D)
{
int a,b,c,d,x,y;
if(W==0)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
x=fun(a,b); //左边的质量
y=fun(c,d); //右边的质量
if(x*b==y*d) return x+y;
else return 0;//不平衡则返回0
}
else
{
return W;
}
}
int main()
{
int t,wl,dl,wr,dr,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&wl,&dl,&wr,&dr);
x=fun(wl,dl);
y=fun(wr,dr);
if(x==0 || y==0) printf("NO\n");
else if(x*dl==y*dr) printf("YES\n");
else printf("NO\n");
if(t) printf("\n");
}
return 0;
}
别人的代码:
只要节点处的质量不为 0 ,起就有子树,递归走完全部输入 ~
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int flag;
int judge()
{
int wl,dl,wr,dr;
scanf("%d%d%d%d",&wl,&dl,&wr,&dr);
if(wl && wr) // 两边质量都不为0,则为叶子节点
{
if(wl * dl != wr * dr) // 两边不平衡,则标记为1
{
flag = 1;
return 0;
}
else
return wl + wr;
}
else
{
if( !wl ) //只要节点不为 0,便有子树
wl = judge();
if( !wr )
wr = judge();
if(wl * dl != wr * dr)
{
flag = 1;
return 0;
}
else
return wl + wr;
}
}
int main()
{
#ifdef state
freopen("sample.txt","r",stdin);
#endif
int num;
scanf("%d",&num);
while(num--)
{
flag = 0;
judge();
if(!flag)
puts("YES");
else
puts("NO");
if(num)
puts("");
}
return 0;
}