不懂 为何要w=w1+w2 这会对递归产生什么影响呢
#include<iostream>
using namespace std;
// 输入一个子天平,返回子天平是否平衡,参数W修改为子天平的总重量
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;//不懂这句话的存在意义,但是当时交的时候没有这句话就会wr
return b1 && b2 && (W1 * D1 == W2 * D2);
}
int main() {
int T, W;
cin >> T;
while(T--) {
if(solve(W)) cout << "YES\n"; else cout << "NO\n";
if(T) cout << "\n";
}
return 0;
}
这个方法是大体一致的
#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);//同样的不懂为啥一定要返回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;
}