计蒜客 正方形 (dfs好题,具有参考价值)

来源:互联网 发布:xd是什么软件 编辑:程序博客网 时间:2024/06/03 12:52

题目:


题目思路:先将木棍长度数组降序排序,dfs前先判断一下是否符合题意,然后进行dfs,dfs出结果就退出,需要剪枝的地方,dfs 用一个参数记录上一次搜索的位置在哪里,下一次搜索只会在这条边之后。搜索完一条边后pos再置为0。

代码:

#include<bits/stdc++.h>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;    }}