计蒜客 正方形 (dfs好题,具有参考价值)
题目:
题目思路:先将木棍长度数组降序排序,dfs前先判断一下是否符合题意,然后进行dfs,dfs出结果就退出,需要剪枝的地方,dfs 用一个参数记录上一次搜索的位置在哪里,下一次搜索只会在这条边之后。搜索完一条边后pos再置为0。
代码:
-
-
using namespace std;
-
int l[ 30];
-
bool mark[ 30];
-
int n,sum,one;
-
bool cmp(int a,int b)
-
{
-
return a>b;
-
}
-
int flag= 0;
-
void dfs(int onel,int num,int pos)
-
{
-
if(flag== 1) return ;
-
if(num== 3){
-
flag= 1;
-
return ;
-
}
-
if(onel == 0){
-
num++;
-
onel=one;
-
pos= 0;
-
}
-
-
for( int i=pos;i<n;i++){
-
if(!mark[i]){
-
if(onel>=l[i]){
-
mark[i]= true; //标记为已访问
-
dfs(onel-l[i],num,i);
-
mark[i]= false; //未访问
-
}
-
}
-
}
-
}
-
-
int main()
-
{
-
fill(mark,mark+ 30, false);
-
cin>>n;
-
int sum= 0;
-
for( int i= 0;i<n;i++){
-
cin>>l[i];
-
sum+=l[i];
-
}
-
one = sum/ 4;
-
sort(l,l+n,cmp);
-
if(l[ 0]>one||sum% 4) cout<< "No"<< endl;
-
else{
-
dfs(one, 0, 0);
-
if(flag== 1) cout<< "Yes"<< endl;
-
else cout<< "No"<< endl;
-
}
-
}
-