POJ-2362-Square

来源:互联网 发布:申友留学怎么样 知乎 编辑:程序博客网 时间:2024/06/14 16:19

一般的DFS题,求所给N条边,是否可以组成一个正方形

代码:

#include<cstdio>#include<cstring>#include<iostream>#define MAX 21using namespace std;int n,m,flag,a[MAX],vis[MAX];void DFS(int sum,int s,int index){    if(sum>m||flag||index>4)return;    if(index==4)    {flag=1;return;    }    for(int i=s;i<n;i++)    {if(!vis[i]){    vis[i]=1;    if(sum+a[i]==m)DFS(0,0,index+1);    elseDFS(sum+a[i],i+1,index);    vis[i]=0;}    }}int main(){    int cas;    scanf("%d",&cas);    while(cas--)    {scanf("%d",&n);int sum=0,maxlen=0;for(int i=0;i<n;i++){    scanf("%d",&a[i]);    sum+=a[i];    maxlen=max(maxlen,a[i]);}if(sum%4||maxlen>sum/4||sum<4){    printf("no\n");    continue;}m=sum/4;memset(vis,0,sizeof(vis));flag=0;DFS(0,0,0);if(flag)    printf("yes\n");else    printf("no\n");    }    return 0;}