HDU 1518 Square

来源:互联网 发布:乐视电视转换网络电视 编辑:程序博客网 时间:2024/06/05 13:36

大意:给出N跟木棍,问是否能用这些木棍拼出一个正方形。
做法:DFS,DFS前,先判断总长度sum是否整除4,不整除直接NO。整除进行DFS判断。边长为sum/4.

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int a[22],flag[22],sum,t;bool DFS(int l1,int l2,int count1)//l1是一条边的边长,l2是这次可以选的棍子的起始编号,count是拼好了的边的个数。{    if(l1 == sum)//拼好一条边,从新开始拼第二条。    {        l1 = 0;        l2 = 0;        count1++;        if(count1 == 4)//如果拼好4条边,就返回true。            return true;    }    for(int i = l2 ; i < t ; i++)    {        if(!flag[i])        {            flag[i] = true;            if(l1+a[i]<=sum&&DFS(l1+a[i],i+1,count1))                return true;            flag[i] = false;        }    }    return false;}int main(){    int n;    scanf("%d",&n);    while(n--)    {        sum = 0;        bool flag1 = false;        memset(flag,false,sizeof(flag));        scanf("%d",&t);        for(int i = 0 ; i < t ; i ++){            scanf("%d",&a[i]);            sum += a[i];        }        if(sum%4==0)        {            sum /= 4;            flag1 = DFS(0,0,0);        }        if(flag1) printf("yes\n");        else printf("no\n");    }    return 0;}
0 0