POJ 2362 Square DFS

来源:互联网 发布:广州趣丸网络 收购 编辑:程序博客网 时间:2024/05/22 02:11

传送门:http://poj.org/problem?id=2362

题目大意:

给一些不同长度的棍棒,问是否可能组成正方形。


学习了写得很好的dfs

赶紧去玩博饼了。。。。。晚上三个地方有约。。。。。T T分身乏术啊。。。。


#include<cstdio>#include<algorithm>using namespace std;const int MAXN=22;int side[MAXN],target,n;bool vis[MAXN];bool dfs(int num,int cur_len,int begin){if(num==3)//如果3条可以构建完成,那么第4条必然可以return true;for(int i=begin;i<n;i++){if(vis[i]==true)continue;vis[i]=true;if(side[i]+ cur_len< target){if(dfs(num,side[i]+cur_len,i))//继续构建return true;}if(side[i]+ cur_len== target){if(dfs(num+1,0,0))//新的一条边return true;}vis[i]=false;}return false;}int main(){int T;scanf("%d",&T);while(T--){int sum=0;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&side[i]);sum+=side[i];vis[i]=false;}if(sum%4!=0||n<4)//和不被4整除,意味着不能组成4条边。{printf("no\n");continue;}sort(side,side+n);target=sum/4;if(target < side[0])//最小的一遍比要组成的边长。。。。。{printf("no\n");continue;}if(dfs(0,0,0))printf("yes\n");elseprintf("no\n");}}


原创粉丝点击