http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=909
#include<stdio.h>//全部边都要用上,这点之前没注意到,读题的缘故。
#include<string.h>//TLE ,了,需要剪枝....边等于0的 就略去。
int a[30],b[30];//存数
int flag[30];//标记
int ff;
int N,M;
int main()
{
void find_e(int pos,int rem,int edge);
int edge;
scanf("%d",&N);
while(N--)
{
int sum=0;
int i,j;
scanf("%d",&M);
memset(b,0,sizeof(b));
for(i=0,j=0;i<M;i++)
{
scanf("%d",&a[i]);
if(a[i]!=0)
{
b[j]=a[i];
j++;
}
sum+=a[i];
}
memset(flag,0,sizeof(flag));
edge=sum/4;
ff=0;
if(sum%4!=0||edge==0) printf("no\n");//这种情况一定输出no,因为它连正方形都组不成,加个情况,输入全为0.输出no.
else
{
find_e(0,edge,edge);//d 调用函数,找出3组与edge相等的数
if(ff==3) printf("yes\n");
else printf("no\n");
}
}
return 0;
}
void find_e(int pos,int rem,int edge)
{
int i;
i=pos;
while(i<=M)//测试数据第三组时出现死循环,应该不是数字重复的问题吧,第一组也重复的,再输一组8个数的测试数据也死了
{
if(rem==b[i]&&flag[i]==0)//当能组成正方形大于四个的情况无法输出,死了。
{
flag[i]=1;
ff++;
i++;
rem=edge;
}
else if(rem>b[i]&&flag[i]==0)
{
flag[i]=1;
find_e(i+1,rem-b[i],edge);
flag[i]=0;
i++;
}
else if(rem<b[i])
{
i++;
}
if(ff==3) break;//加个这个就解决了, 即在外面加break。但是还是WA
}
}