zoj 1909 狂TLE 求解释啊啊

来源:互联网 发布:整站下载软件 编辑:程序博客网 时间:2024/05/05 09:04

 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
 }
}