/*
这是一道深度优先搜索算法题目 类似于Sticks这个题目,但是复杂度比Sticks低
只是需要掌握深搜的特点和进行一般剪枝就行了,其实就是应该从大到小进行排列,
大的边的灵活性小于小边,也就是说他的可能错误组合数最少很快便能够找到正确的
组合(如果这一组有正确解的话)
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 25
using namespace std;
int T,M,sideLen;
int stick[N],vis[N];
int dfs(int nowLen,int nowSide,int start)
{
if(nowSide == 4)
return 1;
for(int i=start;i<=M;i++)
{
if(!vis[i])
{
if(!vis[i-1]&&stick[i] == stick[i-1])
{
i++;
continue;
}
if(nowLen + stick[i]<sideLen)
{
vis[i] = 1;
if(dfs(nowLen+stick[i],nowSide,i+1))
return 1;
else
vis[i] = 0;
}
else if(nowLen + stick[i] == sideLen)
{
vis[i] = 1;
if(dfs(0,nowSide+1,1))
return 1;
else
vis[i] = 0;
}
}
}
return 0;
}
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int i,sum;
//freopen("1.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
sum = 0;
memset(vis,0,sizeof(vis));
scanf("%d",&M);
for(i=1;i<=M;i++)
{
scanf("%d",&stick[i]);
sum += stick[i];
}
sort(stick+1,stick+M+1,cmp);
if(sum%4!=0)
{
printf("no\n");
}
else
{
sideLen = sum/4;
if(dfs(0,0,1))
printf("yes\n");
else
printf("no\n");
}
}
}
poj 2362 Square
最新推荐文章于 2017-05-02 08:35:13 发布