Square POJ - 2362
Square
POJ - 2362Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square?
InputThe first line of input contains N, the number of test cases. Each test case begins with an integer 4 <= M <= 20, the number of sticks. M integers follow; each gives the length of a stick - an integer between 1 and 10,000.
OutputFor each case, output a line containing "yes" if is is possible to form a square; otherwise output "no".
Sample Input3 4 1 1 1 1 5 10 20 30 40 50 8 1 7 2 6 4 4 3 5Sample Output
yes no yes题解+解析:
#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include <cstring>
#include <cmath>
#include <string>
#include <queue>
#define INF 0x7f7f7f7f
typedef long long ll;
using namespace std;
int n;
int m[25];
bool visit[25];
int sum, mid;
int flag;
void dfs(int num, int len, int s)//num为凑好的边的个数,len为现在在凑的木棍长度,s代表起点位置
{
if (flag)//
{
return;
}
if (num == 4)
{
flag = true;
return;
}
if (len == mid)
{
dfs(num+1, 0, 0);//符合边长,深搜下一条边
}
for (int i = s; i < n; i++)
{
if (!visit[i]&&len+m[i]<=mid)//不搜重复和不符合条件的
{
visit[i] = true;
dfs(num, len+m[i], i+1);//符合条件就搜一下
visit[i] = false;//回溯
}
}
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
sum = 0;
flag = false;
memset(visit, 0, sizeof(visit));
scanf("%d", &n);
for (int i =0; i < n; i++)
{
scanf("%d",&m[i]);
sum += m[i];
}
sort(m,m+n);//排序
mid = sum/4;
if(mid*4!=sum)//如果mid不是整数,直接输出no
{
printf("no\n");
continue;
}
if (m[n-1]>mid)//如果最长的棍大于边长,直接输出no
{
printf("no\n");
continue;
}
dfs(0,0,0);
if (flag)
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
return 0;
}