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 }

 

posted @ 2013-01-28 17:06  ihge2k  阅读(1210)  评论(1编辑  收藏  举报