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 }