POJ 2362:Square(DFS)
问所给木棒能否构成一个正方形
难点在于木棒可以拼接,比如2 2 1 1 2也是能构成正方形的
这题的剪枝有点意思:
第一是提前判断所给的木棒长度之和能否被4整除,不能直接输出NO
第二是只需满足上面的条件后,只需要找到3条边就行了,剩下一条边自然也符合
l表示已找到的长度,cnt为已找到的边
#include"cstdio" #include"cmath" #include"cstring" #include"algorithm" #include"iostream" #include"queue" #define MAXN 25 using namespace std; int len[MAXN],num,ave,vis[MAXN],ok; bool dfs(int l,int cnt,int cur) { if(l==ave){ cnt++; l=0; cur=0; if(cnt==3) return true; } for(int i=cur;i<num;i++){ if(!vis[i]&&len[i]+l<=ave){ vis[i]=1; if(dfs(len[i]+l,cnt,i+1)) return true; vis[i]=0; } } return false; } int main() { int n; scanf("%d",&n); while(n--){ scanf("%d",&num); int temp=0; for(int i=0;i<num;i++) { scanf("%lld",&len[i]); temp=temp+len[i]; } sort(len,len+num); memset(vis,0,sizeof(vis)); if(temp%4) printf("no\n"); else{ ave=temp/4; if(dfs(0,0,0)) printf("yes\n"); else printf("no\n"); } } return 0; }