HDUOJ 1518 Square(深搜)
solution:经典的深搜思路;
先判断行不通的情况:
1、棍子总长不是4的倍数必然不能组成正方形
2、最长棍的长度的四倍大于棍子总长必然不能组成正方形
再一条边一条边地进行搜索
#include <bits/stdc++.h>
using namespace std;
int n, sum;
int a[22];
bool flag, vis[22];
void dfs(int i, int l, int k)
{
if (k == 3){//已有三条边齐了,已经满足条件
flag = true;
return;
}
if (!vis[i]){
vis[i] = true;
if (l + a[i] < sum / 4){
if (i > 0)dfs(i - 1, l + a[i], k);
if (flag)return;
}
if (l + a[i] == sum / 4){
dfs(n - 1, 0, k + 1);
if (flag)return;
}
vis[i] = false;
}
if (i > 0)dfs(i - 1, l, k);
}
int main()
{
int t;
cin >> t;
while (t--)
{
cin >> n;
sum = 0;
for (int i = 0; i < n; ++i){
cin >> a[i];
sum += a[i];
}
sort(a, a + n);
fill(vis, vis + n, false);
if(sum % 4 || a[n - 1] * 4 > sum){
cout << "no" << endl;
continue;
}
flag = false;
dfs(n - 1, 0, 0);
if (flag)cout << "yes" << endl;
else cout << "no" << endl;
}
return 0;
}