• hdu1518 Square(dfs)


    Square

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5987    Accepted Submission(s): 1916

    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
     
    深搜,注意优化,就可以了
    题意是:给你M根木棍,看看能不能拼出正方形来;
    #include<iostream>
    #include<cstring>
    using namespace std;
    int visit[25][2];
    int len,sum,m,count,num,k,flag;
    void dfs(int now,int len,int index)//now:第几条边  len:该边现在组成的长度 index:用来优化时间
    {
        if (now==5)
        {
            flag=1;
            return ;
        }
        if (len==num)
        {
            dfs(now+1,0,0);
            if (flag)//优化时间
                return ;
        }
    
        for (int i=index;i<m;i++)//从index开始优化时间
        {
            if (!visit[i][1]&&visit[i][0]+len<=num)
            {
                visit[i][1]=1;
                dfs(now,visit[i][0]+len,i+1);//“visit[i][0]+len”不可提出来,
                if (flag)//优化时间
                    return;
                visit[i][1]=0;
            }
        }
    }    
    
    int main()
    {
        int n,i,j;
        scanf("%d",&n);
        while(n--)
        {
            sum=0;
            count=0;
            scanf("%d",&m);
            for(i=0;i<m;i++)
            {
                scanf("%d",&visit[i][0]);
                sum+=visit[i][0];
                visit[i][1]=0;
            }
            if(sum%4!=0||m<4||m>20)
            {
                printf("no
    ");
                continue;
            }
            else
            {
                k=m/4;
                num=sum/4;
                for(i=0;i<m;i++)
                    if(visit[i][0]>num)
                        {printf("no
    ");break;}
                flag = 0;
                dfs(1,0,0);
                if(flag)
                    printf("yes
    ");
                else
                    printf("no
    ");
               }
    
        }
        return 0;
    }
    
    /*
    5
    8 3 4 5 6 7 8 5 2
    7 4 5 6 8 10 5 2
    7 4 5 6 8 10 4 3
    6 3 4 4 3 1 1 
    20 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    */

    就这样吧,我会更加努力的

  • 相关阅读:
    dotnet core部署方式两则:CLI、IIS
    oracle的loop等循环语句的几个用法小例子[转]
    NET Core 环境搭建和命令行CLI入门[转]
    电视不支持AirPlay镜像怎么办?苹果iPhone手机投屏三种方法
    haproxy+keepalived实现web集群高可用性[转]
    论程序员的时代焦虑与焦虑的缓解[转]
    使用C#压缩解压rar和zip格式文件
    C#获取并修改文件扩展名的方法
    普通码农的思维总结【转】
    T4生成实体,单张表和多张表
  • 原文地址:https://www.cnblogs.com/yuyixingkong/p/3252353.html
Copyright © 2020-2023  润新知