pku 2362 Square
2010-04-07 12:01
232 查看
这是我在csdn写的第一篇文章,这道题也是我第一次用回溯法做出来的题目,虽然不是什么难题,但是挺有纪念意义,以此记载
题目意思:
给出你不同长短的木棍,问是否能够构成一个正方形
解题思路:
暴力搜索+简单剪枝
1、如果所有木棍的长度加起来不能整除4,那么一定不能构成正方形
2、如果有一条木棍长度超过一条边的长度,那么也可以排除了
3、搜索前按降序排序能减少重复搜索
题目意思:
给出你不同长短的木棍,问是否能够构成一个正方形
解题思路:
暴力搜索+简单剪枝
1、如果所有木棍的长度加起来不能整除4,那么一定不能构成正方形
2、如果有一条木棍长度超过一条边的长度,那么也可以排除了
3、搜索前按降序排序能减少重复搜索
#include <iostream> #include <cstdlib> using namespace std; int cmp(const void *a, const void *b) { return *(int *)b - *(int *)a; } int list[21],n,sum,average; bool visited[21],flag; void backtrack(int edge, int s, int len) { if(edge <= 1) flag = true; if(flag == true) return; if(len==0) // 如果这木棍能够形成一条边 for(int i = 1; i <= n; ++i) if(!visited[i] && flag == false) { visited[i] = true; backtrack(edge-1, i, average - list[i]); visited[i] = false; } for(int i = s; i <= n; ++i) // 还不能形成一条边 if(!visited[i] && len >= list[i] && flag == false) { visited[i] = true; backtrack(edge, i, len - list[i]); visited[i] = false; } } void dfs() { flag = false; for(int i = 1; i <= n; ++i) visited[i] = false; backtrack(4, 1, average); } int main() { int t,sum,rs; cin>>t; while(t--) { cin>>n; flag = true; sum = 0; for(int i = 1; i <= n; ++i) { cin>>list[i]; sum += list[i]; } if(sum%4==0) average = sum/4; else // 如果所有数加起来不能整除4就不用管了 flag = false; qsort(&list[1], n, sizeof(int), cmp); if(list[1] > average) flag = false; // 如果有一条木棍大于平均值也不构正方形 if(flag) { dfs(); } if(flag) cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }
相关文章推荐
- pku 2362 Square
- pku2362 Square(又是TLE.....................)
- pku 2362_Square 深搜+回溯
- pku acm 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(DFS)
- poj 2362 square-----搜索+剪枝
- poj2362——Square(深搜dfs)
- POJ 2362 Square
- poj 2362 Square(简单深搜+剪枝)
- POJ 2362 HDOJ 1518 Square DFS剪枝
- POJ 2362 Square
- poj 2362 Square