您的位置:首页 > 其它

POJ_2362_Square(DFS)

2013-11-07 16:20 260 查看
题型:搜索

题意:将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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: