HDU 1518 Square——dfs 论一句话的重要性

来源:互联网 发布:传奇霸业转生13数据 编辑:程序博客网 时间:2024/05/16 10:35

题目链接点击打开链接

题意:给定一些长度,问这些长度能否拼成正方形。

思路:dfs。树的深度为3,每一次终点为边长。

这道题思路不难,重点在剪枝和优化上。

下图是我每次只改一句话,在virtual judge提交每次的运行时间,其中有一次逗比改错了。。。


论一句话的重要性啊!!!

AC代码

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<iomanip>#include<algorithm>#include<cmath>using namespace std;int n,aver;int flag=0,a[50],vis[50];void dfs(int cnt,int len,int index){    if(len==aver) dfs(cnt+1,0,0);    if(cnt==3)//只找3条边即可,剩下的一定能组成一条边    {        flag=1;        return;    }    if(flag) return;//不加这一句会TLE    for(int i=index; i<n; i++)    {        if(!vis[i] && len+a[i]<=aver)        {            vis[i]=1;            dfs(cnt,len+a[i],i+1);            if(flag) return;//加不加效果一样。。。            vis[i]=0;            if(len==0) return ;//这是神奇的一句话,加上从800ms到200ms。这句话表示在进行了一次从下标0到n-1的dfs后得不到一条符合的边,回溯回来,len为0,从下标0开始找不到之后就更不用找了,直接退出。        }    }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        memset(vis,0,sizeof(vis));        scanf("%d",&n);        int sum=0;        flag=0;        for(int i=0; i<n; i++)        {            scanf("%d",&a[i]);            sum+=a[i];        }        aver=sum/4;        if(sum%4!=0) printf("no\n");//剪枝        else        {            sort(a,a+n,greater<int>());//从大到小排序,时间从200ms到60ms            if(a[0]>aver)//剪枝            {                printf("no\n");                continue;            }            dfs(0,0,0);            if(flag) printf("yes\n");            else printf("no\n");        }    }    return 0;}


0 0
原创粉丝点击