您的位置:首页 > 其它

pku 2362 Square

2010-04-07 12:01 232 查看
这是我在csdn写的第一篇文章,这道题也是我第一次用回溯法做出来的题目,虽然不是什么难题,但是挺有纪念意义,以此记载

题目意思:

给出你不同长短的木棍,问是否能够构成一个正方形

解题思路:

暴力搜索+简单剪枝

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