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
- poj 2362 Square
- poj 2362 Square
- poj 2362Square(DFS)
- poj 2362 Square
- POJ 2362 Square dfs
- poj 2362 Square
- POJ-2362-Square
- POJ 2362 Square
- poj 2362 Square
- poj 2362 Square
- POJ 2362 Square
- POJ 2362 Square DFS
- POJ 2362 Square
- poj 2362 Square
- poj 2362 Square
- POJ - 2362 Square
- poj 2362 Square
- poj 2362:Square
- 开源工具:5个优秀的音频编辑器
- POJ 2251 Dungeon Master
- poj1328 Radar Installation(贪心)
- GCD多线程之dispatch queue
- MyEclipse创建Maven工程
- poj 2362:Square
- 上一个没写完,怎么感觉代码没写好。。哎
- poj 2295: A DP Problem
- LeetCode OJ - Pascal's Triangle
- poj 1002
- 新的学习之
- Linux下的命令使用小结
- 异常在子父类覆盖中的体现
- 开始:触摸MySQL