hdu-1518-Square-深搜+剪枝(同hdu1455)
2015-05-28 15:26
399 查看
Square
Problem DescriptionGiven a set of sticks of various lengths, is it possible to join them end-to-end to form a square?
Input
The first line of input contains N, the number of test cases. Each test case begins with an integer 4 <= M <= 20, the number of sticks. M integers follow; each gives the length of a stick - an integer between 1 and 10,000.
Output
For each case, output a line containing "yes" if is is possible to form a square; otherwise output "no".
Sample Input
3 4 1 1 1 1 5 10 20 30 40 50 8 1 7 2 6 4 4 3 5
Sample Output
yes no yes
给出m个数代表木棍的长度,问这m条木棍能否形成一个正方形
1、先将m个数从大到小排列
2、将m个数之和sum,x=sum/4作为边长,进行搜索,
三个参数:(1)形成一条边长时的当前长度su,(初始为0) (2)形成边的数目cc (3)下一次搜索的位置pos
对于(3),当su+s[i]<x,下一次应从i+1开始搜,因为前面满足的都已经标记过了,而当su+s[i]==x时说明已经找到一条边了,则下一次应重新从0开始找
对于su+s[i]==x,当s[i]不满足,则后面所有能形成s[i]的都不满足
对于su==0,说明s[i]作为第一条木棍不能满足,则在其他边也不能满足
s[i]==s[i+1] ,如果s[i]不满足,则与它相等的s[i+1]也不用再搜了
#include<stdio.h> #include<string.h> #include<iostream> #include<vector> #include<algorithm> using namespace std; int s[50],sum,m,x; int vis[50]; int cmp(int aa,int bb) { return aa>bb; } int dfs(int su,int cc,int pos) { if(cc==4) return 1; if(su == x) { su=0; cc++; } for(int i=pos ; i < m ; i++) { if(vis[i] == 0 && su+s[i]<=x) { vis[i]=1; if(su+s[i]<x) { if(dfs(su+s[i],cc,i+1)) return 1; } else if(su+s[i]==x) { if(dfs(0,cc+1,0)) return 1; } vis[i]=0; if(su+s[i]==x || su==0 ) break; while(i+1<m && s[i]==s[i+1]) { i++; } } } return 0; } int main() { int n,T,i; scanf("%d",&T); while(T--) { memset(vis,0,sizeof(vis)); scanf("%d",&m); sum = 0; for(i=0 ; i < m ; i++) { scanf("%d",&s[i]); sum+=s[i]; } sort(s,s+m,cmp); x=sum/4; if(sum%4==0 && dfs(0,0,0)) printf("yes\n"); else printf("no\n"); } return 0; }
相关文章推荐
- hdu 1518 Square(深搜+剪枝)
- hdu 1518 Square(深搜+剪枝)
- HDU--杭电--1518--Square--深搜--要剪枝
- hdu 1518 Square【DFS+剪枝】
- HDU 1518 Square (DFS+剪枝)
- HDU1518 Square 【剪枝】
- HDU 1518 Square 搜索
- HDU-1518 Square(深搜)
- HDU -1518 Square 神搜给力啊!
- hdu 1518 Square (DFS)
- POJ 2362 HDOJ 1518 Square DFS剪枝
- HDU 1518 Square
- HDU 1518 Square
- hdoj 1518 Square (DFS + 剪枝)
- hdu 1518 Square(dfs)
- 【DFS+剪枝】-HDU-1518-Squares
- HDU 1518 Square
- HDU-1518 Square 搜索
- POJ 2362 && HDU 1518 Square(dfs)
- HDU 1518 Square