• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
若忆_star
博客园    首页    新随笔    联系   管理    订阅  订阅
hdu 1518 Square(深搜+剪枝)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1518

题目大意:根据题目所给的几条边,来判断是否能构成正方形,一个很好的深搜应用,注意剪枝,以防超时!

 1 #include <iostream>
 2 #include <cstdio>
 3 #include<algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 int ap[30],visit[30];
 7 int l,n;
 8 int dfs(int len,int gen,int iqq)
 9 {
10     if (gen==3)
11         return 1;
12     for(int i=iqq; i<n; i++)
13     {
14         //cout<<visit[len]<<endl;
15         if (!visit[i])
16         {
17             visit[i]=1;
18             if (len+ap[i]==l)
19             {
20                 //cout<<len<<endl;
21                 if(dfs(0,gen+1,0))
22                     return 1;
23             }
24             else if (len+ap[i]<l)
25             {
26                 //cout<<len<<endl;
27                 if(dfs(len+ap[i],gen,i)) return 1;
28             }
29             visit[i]=0;
30         }
31     }
32     return 0;
33 }
34 int main ()
35 {
36     int t,sum;
37     while (cin>>t)
38     {
39         while (t--)
40         {
41             cin>>n;
42             sum=0;
43             //Max=0;
44             for (int i=0; i<n; i++)
45             {
46                 cin>>ap[i];
47                 sum+=ap[i];
48             }
49             memset(visit,0,sizeof(visit));
50             sort(ap,ap+n);
51             if (sum%4==0&&n>=4&&ap[n-1]<=sum/4)
52             {
53 
54                 l=sum/4;
55                 if (dfs(0,0,0))
56                     printf ("yes\n");
57                 else
58                     printf ("no\n");
59                 //cout<<n<<endl;
60             }
61             else printf ("no\n");
62         }
63     }
64 }

 

posted on 2014-07-31 08:00  若忆_star  阅读(243)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3