poj 2362:Square

来源:互联网 发布:java 泛型编程 编辑:程序博客网 时间:2024/06/05 17:40

解题思路:

DFS+剪枝

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>using namespace std;int m,n,s;int stick[25];bool used[25];bool flag;int cmp(const void * a, const void * b){return *(int *)b - *(int *)a;}//sum 表示已获取边长数//l 表示已拼凑的长度//t 搜索下一根木棍的开始位置 void func(int sum,int l,int t){if(flag)return;if(sum == 4){flag = true;return;}//得到一条完整的边 if(l == s/4){func(sum+1,0,0);return;}for(int i=t;i<n;i++){if(flag)return;//若某条木棍与已得长度相加等于边长,则不必尝试使用其他木棍 if(stick[i] + l == s/4 && !used[i]){used[i] = true;func(sum,stick[i] + l,0);used[i] = false;return;}else if(stick[i] + l < s/4 && !used[i]){used[i] = true;func(sum,stick[i] + l,i+1);used[i] = false;}}return;}int main(){scanf("%d",&m);while(m--){scanf("%d",&n);s = 0;memset(used,0,sizeof(used));flag = false;int maxl = 0;for(int i=0;i<n;i++){scanf("%d",&stick[i]);s += stick[i]; if(stick[i] > maxl)maxl = stick[i];}//若存在木棍超出边长 或者 总长度不是4的整数倍,输出“no” if(s % 4 != 0 || maxl > s /4){printf("no\n");continue;}//从大到小排序 qsort(stick,n,sizeof(stick[0]),cmp);//从零开始搜索 func(0,0,0);if(flag)printf("yes\n");elseprintf("no\n");}return 0;}


0 0
原创粉丝点击