POJ_2362_Square(DFS)
2013-11-07 16:20
260 查看
题型:搜索
题意:将n个木棍组成一个正方形
分析:
与1011的Sticks类似,DFS+剪枝,关键在于如下剪枝:
(1)若总长度不能被4整除,则无法组成正方形
(2)若最长的木棍比预期的正方形的边长还要长,则无法组成正方形
(3)在组合的过程中就发现无法构成一条符合的边长,则没有必要再继续搜索了
有了这些剪枝,写起来就比较清晰简单了。
代码:
题意:将n个木棍组成一个正方形
分析:
与1011的Sticks类似,DFS+剪枝,关键在于如下剪枝:
(1)若总长度不能被4整除,则无法组成正方形
(2)若最长的木棍比预期的正方形的边长还要长,则无法组成正方形
(3)在组合的过程中就发现无法构成一条符合的边长,则没有必要再继续搜索了
有了这些剪枝,写起来就比较清晰简单了。
代码:
#include<iostream> #include<cstring> #include<cmath> #include<cstdio> #include<algorithm> using namespace std; int n,a[50]; bool vis[50],flag; int standard; int sum,max_stick; bool cmp(int a,int b) { return a>b; } void dfs(int begin,int len,int cnt) { if(cnt==3) { flag = true; return; } if(len==standard) dfs(0,0,cnt+1); if(flag) return; for(int i=begin; i<n; i++) { if(!vis[i] && a[i]+len<=standard) { vis[i] = true; dfs(i+1,len+a[i],cnt); if(flag) return; vis[i] = false; } } } int main() { int t; scanf("%d",&t); while(t--) { sum=0; max_stick=0; scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&a[i]); sum+=a[i]; max_stick=max(max_stick,a[i]); } if(sum%4!=0 || max_stick*4>sum) { printf("no\n"); continue; } standard=sum/4; sort(a,a+n,cmp); memset(vis,false,sizeof(vis)); flag=false; dfs(0,0,0); if(flag) printf("yes\n"); else printf("no\n"); } return 0; }
相关文章推荐
- POJ 2362 square &&POJ 1011 Sticks 记忆化搜索 DFS
- POJ 2362 square(DFS范例题)
- POJ 2362 Square(DFS回溯构造)
- POJ 2362 && HDU 1518 Square(dfs)
- POJ 2362 Square (DFS +剪枝)
- POJ 2362 HDOJ 1518 Square DFS剪枝
- DFS POJ 2362 Square
- 【POJ】2362 Square(DFS)
- DFS POJ 2362 Square
- poj 2362 Square(dfs, 剪枝)
- hdu 1518||poj 2362 Square(dfs)
- poj2362——Square(深搜dfs)
- poj 2362Square(DFS)
- dfs Square poj 2362
- POJ 2362:Square(DFS)
- POJ 2362 Square
- POJ 2362 Square
- Square DFS poj&hoj
- poj 2362 Square (dfs+剪枝)
- poj 2362 Square