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 }

 

你可能感兴趣的:(HDU)