HDU 1518 Square

题意:给你n根棍子跟它的边长,要你能用这些棍子组一个正方形

思路:回溯法

能组正方形条件:

1、棍子总长%4要等于0

2、不能出现棍子的长度大于正方形的边长

3、棍子数大于等于4

直接用回溯肯定会超时,所以我们须要来优化空间了

1、对于已使用的边,不能在它的子树中使用

2、因为题目是推断能不能组正方形,所以仅仅要满足了条件,就直接结束!

所以AC代码:

#include <stdio.h>
#include <string.h>
int n,sum;
int a[30],vis[30];
int flag;
void dfs(int bian,int l,int k)
{
    int i;
    if(bian==5)
    {
        flag=1;
        return ;
    }
    if(l==sum)
    {
        dfs(bian+1,0,0);
        if(flag)
            return ;
    }
    for(i=k;i<n;i++)
    {
        if(!vis[i]&&l+a[i]<=sum)
        {
            vis[i]=1;
            dfs(bian,a[i]+l,i+1);
            if(flag)
                return;
            vis[i]=0;
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int i;
        sum = 0;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        if(sum%4!=0)
        {
            printf("no
");
            continue;
        }
        sum=sum/4;
        for(i=0;i<n;i++)
        {
            if(a[i]>sum)
                break;
        }
        if(i!=n)
        {
            printf("no
");
            continue;
        }
        memset(vis,0,sizeof(vis));
        flag=0;
        dfs(1,0,0);
        if(flag)
            printf("yes
");
        else
            printf("no
");
    }

    return 0;
}


原文地址:https://www.cnblogs.com/gcczhongduan/p/4088710.html