//又是DFS,其实就是建树然后一边建一般判读,但是很多这种题都不一定真刀真枪地
//把建树语句写出来,只要是这种思路即可,这样就可以减少时间
#include <stdio.h> int ok; int dfs() { int w1,d1,w2,d2; scanf("%d%d%d%d",&w1,&d1,&w2,&d2); if(w1 && w2 && d1 && d2) { if( (w1*d1) != (w2*d2) ) {ok=0; return 0;} else return (w1+w2); } else { if(!w1) w1=dfs(); // if(ok==0) return 0; //这两个优化不能做,虽然原理是正确的,但是这道题有一个陷阱,它数据的读入一定要完全读完如果中途返回来就无法再读取数据//了,虽然那些数据也不会改变结果,然后这些漏掉无法读取的数据会塞到下一组数据中,造成一个很严重的错误 if(!w2) w2=dfs(); // if(ok==0) return 0; //同理 if( (w1*d1) != (w2*d2) ) {ok=0; return 0 ; } else return (w1+w2); } } int main() { int i,N; struct BTree *T; int sum; scanf("%d",&N); for(i=1; i<=N; i++) { ok=1; dfs(); if( ok==1 ) printf("YES\n"); else printf("NO\n"); if(i!=N) printf("\n"); } return 0; }