题目描述:
输入
1 0 2 0 4 0 3 0 1 1 1 1 1 2 4 4 2 1 6 3 2
输出
YES
思路:使用递归进行模拟 要注意输出格式中的空格.
#include<bits/stdc++.h> using namespace std; int n; bool flag=true;//做标记 int solve(){ int w1,w2,d1,d2; cin>>w1>>d1>>w2>>d2; if(!w1) w1=solve(); if(!w2) w2 = solve(); if(w1*d1!=w2*d2){ flag = false; return 0;//该天平不平衡 }else{ return w1+w2;//平衡则返回该子天平的总重量. } } int main() { cin>>n; while(n--){ flag = true; solve(); if(!flag){ cout<<"NO"<<endl; }else{ cout<<"YES"<<endl; } if(n){ cout<<endl; } } return 0; }
下面是刘汝佳算法书的代码,分析学习一下,思路都一样,但代码写的很精辟.
#include<bits/stdc++.h> using namespace std; //输入一个子天平,返回天平是否平衡,参数W修改为子天平的总重量。 bool solve(int &W){ int W1,D1,W2,D2; bool b1=true,b2=true; scanf("%d%d%d%d",&W1,&D1,&W2,&D2); if(!W1)b1=solve(W1); if(!W2)b2=solve(W2); W=W1+W2;//W1,W2用来表示当前左右子天平的质量,W用来存储当前天平的总质量. return b1&&b2&&(W1*D1==W2*D2);//每一边的天平,只要有一个不平衡,则返回值会一直是false. } int main(){ int T,W; scanf("%d",&T); while(T--){ if(solve(W))printf("YES\n"); else printf("NO\n"); if(T)printf("\n"); } }