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;
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务