hdu 1518 又一道搜索经典

刚刚做过hdu 1455那道搜索题,在来做这道,那就像切菜一样。。。,orz,让我这种若菜也体验了一把切题的乐趣。。。。

好吧,还是说一下大意吧。。。这次是为正方形了。。。就是所有的木棒从头到尾相连,判断能否组成一个正方形。。。搜索过程没有像1455那题有那么多的剪枝

。。。orz,我是直接暴力的。。。还是上代码吧。。。

 

 1 #include<iostream>

 2 #include<algorithm>

 3 using namespace std;

 4 

 5 struct stick{

 6     int length;   //长度

 7     int mark;    //标记是够被使用过

 8 };

 9 stick sticks[21];

10 int n,len;

11 

12 int cmp(const stick &s1,const stick &s2){

13     return s1.length>s2.length;

14 }

15 //len为所围成的正方形的边长,l为当前木棒的长度

16 int dfs(int len,int l,int count,int pos){

17     if(count==4)return 1;

18     for(int i=pos;i<n;i++){

19         if(sticks[i].mark)continue;

20         //找到了相等的

21         if(len==(l+sticks[i].length)){

22             sticks[i].mark=1;

23             if(dfs(len,0,count+1,0))return 1;

24             sticks[i].mark=0;

25         }else if(len>(l+sticks[i].length)){

26             sticks[i].mark=1;

27             l+=sticks[i].length;

28             if(dfs(len,l,count,i+1))return 1;

29             l-=sticks[i].length;  //不符合的话要恢复原长

30             sticks[i].mark=0;

31         }

32     }

33     return 0;

34 }

35 

36 int main(){

37     int t;

38     scanf("%d",&t);

39     while(t--){

40         scanf("%d",&n);

41         len=0;

42         for(int i=0;i<n;i++){

43             scanf("%d",&sticks[i].length);

44             len+=sticks[i].length;

45             sticks[i].mark=0;

46         }

47         //不是4的倍数的以及木棒的根数少于4的都不能

48         if(len%4||n<4){

49             printf("no\n");

50             continue;

51         }

52         len/=4;

53         sort(sticks,sticks+n,cmp);

54         if(dfs(len,0,0,0)){

55             printf("yes\n");

56         }else 

57             printf("no\n");

58     }

59     return 0;

60 }

 

你可能感兴趣的:(HDU)