第一次写DFS一遍过,开心!!
题目描述
有n个木棒,需要用上所有木棒,围成一个正方形,如果可以围成正方形,则输出"yes", 否则输出"no"。
输入
第一行输入一个整数T表示样例个数。
对于每个样例,第一行输入一个整数N表示木棍的个数,第二行输入N个数字表示木棒的长度。
输出
对于每个样例,如果可以则输出"yes", 否则输出"no"。
样例输入
3
4
1 1 1 1
5
10 20 30 40 50
8
1 7 2 6 4 4 3 5
样例输出
yes
no
yes
提示
N <= 20
解析
一条边一条边地找,如果找到则level加1。
#include <bits/stdc++.h>
using namespace std;
int arr[20],sum;//arr存储每个火柴的长度,sum是所有火柴的总长
void DFS(int num,int now,int level){
//深度优先搜索
//num是当前火柴的序号,now是现在加的火柴的长度,level是第几根火柴
if(level = 4){
//当有四根火柴的时候完成
cout<<"yes"<<endl;
return;
}
if(num < 0&&level != 4)
{
//火柴没有了且长度相同的不足四条边
cout<<"no"<<endl;
return;
}
if(now == sum/4)
//如果当前加和为总长四分之一,则清空总长,找到一条边level+1
DFS(num - 1,0,level+1);
else
//否则继续加
DFS(num-1,now+arr[num],level);
}
int main()
{
int n;
cin>>n;
for(int l = 0;l<n;l++){
int num;
cin>>num;
int arr[num];
sum = 0;
for(int k = 0;k<num;k++){
cin>>arr[k];
sum+=arr[k];
}
if(sum%4){
//如果/4有余则不可能构成
cout<<"no"<<endl;
continue;
}
//按升序排列
sort(arr,arr+num);
DFS(num - 1,0,1);
}
return 0;
}