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;
}
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;
}
相关文章推荐
- DFS POJ 2362 Square
- POJ 2362 Square 同1011
- dfs Square poj 2362
- POJ 2362 Square(搜索+剪枝)
- POJ 2362 Square
- POJ-2362-Square
- POJ 2362 Square (搜索 + 剪枝)
- POJ 2362(Square-搜索剪枝1-相对顺序)
- poj 2362 Square
- POJ 2362 Square
- poj 2362 hdoj 1518 Square(搜索)
- poj 2362 Square
- POJ 2362 Square
- poj 2362 Square
- POJ 2362 Square
- poj 2362 Square
- poj 2362 Square
- poj 2362 hdoj 1518 Square(搜索)
- POJ 2362:Square 觉得这才算深度搜索
- poj2362——Square(深搜dfs)