您的位置:首页 > 编程语言 > C语言/C++

poj 2362:Square

2014-07-09 21:56 344 查看
解题思路:

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");
else
printf("no\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ poj dfs