Square
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 18078 | Accepted: 6282 |
Description
Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square?
Input
The 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.
Output
For each case, output a line containing "yes" if is is possible to form a square; otherwise output "no".
Sample Input
3 4 1 1 1 1 5 10 20 30 40 50 8 1 7 2 6 4 4 3 5
Sample Output
yes no yes
Source
题意:
给出n段不同长度的木棍,判断其是否能构成正方形
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
int stick[25];
bool visited[25];
int n,t;
int sum,side;
int cmp(const void *a,const void *b)
{
return *(int *)b-*(int *)a;
}
bool search(int len,int s,int num) //当前所接木棍总长度为len,从第s根木棍开始计算,以确定可构成num条边
{
if(num==4) return true;
for(int i=s;i<n;i++)
{
int last=-1; //剪枝:相同长度的木棍只搜索一次
if(visited[i] || stick[i]==last) continue;
visited[i]=true;
if(len+stick[i]<side)
{
if(search(len+stick[i],i+1,num))
return true;
}
else if(len+stick[i]==side)
{
if(search(0,0,num+1))
return true;
}
visited[i]=false;
last=stick[i];
if(len==0) return false;
}
return false;
}
int main()
{
int i;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
scanf("%d",&n);
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&stick[i]);
sum+=stick[i];
}
qsort(stick,n,sizeof(int),cmp);
memset(visited,false,sizeof(visited));
side=sum/4;
if(side*4==sum && search(0,0,0)) printf("yes\n");
else printf("no\n");
}
}
return 0;
}
思路:
深度搜索