HDU-1518-Square

题目链接 

http://acm.hdu.edu.cn/showproblem.php?pid=1518

 

题意:给你n条边,问你用光这些边能不能组成正方形 

这里主要是超时问题:其实对于某条边,对于那些用过的和不符合条件的for那里可以不扫。。。。。所以Dfs要增加一个参数index表示从那里开始扫。。。但是换另外一条边的时候index要改回0,因为那些未用的,对上一条边来说

不符合条件的,可能符合这条边的条件。。。。

 

代码

#include<stdio.h>
#include<string.h>

int success,l,m;
int s[1000];
int visit[1000];

int main(void)
{
void dfs(int now,int len,int index);
int n,i;
scanf("%d",&n);
while(n--)
{
int sum=0;
success=0;
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",s+i);
sum+=s[i];
}
if(sum%4)
{
printf("no\n");
continue;
}
l=sum/4;
for(i=0;i<m;i++)
{
if(s[i]>l)
{
printf("no\n");
break;
}
}
if(i<m)
continue;
memset(visit,0,sizeof(visit));
dfs(1,0,0);
if(success)
printf("yes\n");
else
printf("no\n");
}
return 0;
}

void dfs(int now,int len,int index)
{
int i;
if(now==5)
{
success=1;
return ;
}
if(len==l)
{
dfs(now+1,0,0);
if(success)
return ;
}
for(i=index;i<m;i++)
{
if(visit[i]==0&&len+s[i]<=l)
{
visit[i]=1;
dfs(now,len+s[i],i+1);
if(success)
return ;
visit[i]=0;
}
}
}

posted @ 2014-10-04 11:54  立刻行动  阅读(137)  评论(0编辑  收藏  举报