hdu-Square

Problem 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

解题思路:

主要考察DFS和回溯的思想。关键部分在于DFS那部分函数的构造。

# include<stdio.h>
# include<algorithm>

using namespace std;

int ed[100];
bool hash[100];
bool put_flag=false;
int m;
int aver;
void dfs(int num,int len,int start)//现在成功的边长数,现在边长,当前边长对应下标
{
	if(put_flag==true)
		return;

	if(num==4)
	{
		put_flag=true;
		return;
	}

	if(aver==len)
	{
		num++;
        dfs(num,0,0);//调用
	}

	for(int i=start;i<m;i++)
	{
       if(hash[i]==false&&len+ed[i]<=aver)
	   {
             hash[i]=true;
			 dfs(num,len+ed[i],i+1);//调用

			 hash[i]=false;//回退时赋值
	   }
	}
}

int main()
{
	int n,i,j;
	while(scanf("%d",&n)!=EOF)
	{
       while(n--)
	   {
		   //初始化
           for(i=0;i<100;i++)
		   {
			   ed[i]=-1;
		       hash[i]=false;
		   }

		   int sum=0,max=0,aver=0;
		   scanf("%d",&m);
           for(j=0;j<m;j++)
		   {
			   scanf("%d",&ed[j]);
			   sum+=ed[j];
			   if(ed[j]>max)
				   max=ed[j];
		   }

		   aver=sum/4;
           if(sum%4!=0||max>aver)
		   {
			   printf("no\n");
			   continue;
		   }
           
		   sort(ed,ed+m);

		   dfs(0,0,0);
		   if(put_flag==true)
			   printf("yes\n");
		   else
			   printf("no\n");
	   }
	}
	return 0;
}


posted @ 2018-04-01 17:03  xzhws  阅读(30)  评论(0编辑  收藏  举报