ZOJ 1909Square 题解

来源:互联网 发布:全球气候变暖数据 编辑:程序博客网 时间:2024/05/17 02:03

题目:给你一堆木条,然后让你通过头尾相接的方式让其组成一个正方形,问你是否有这样的可能性

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1909

先判断是否能整除4,能的话,再用dfs暴力搜索 搜索到一个边之后,再搜索另一个边,搜索完第3个边之后就可以已经组成正方形了


#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <vector>#include <map>#include <stack>#include <queue>#include <list>#define LL long long#define INF 0x7fffffff#define FIN 0x80000000using namespace std;int n;int num[22],vis[22];//pos递归的位置  cnt是已经搜索到的正方形边的个数  len是正在搜索的边的当前长度  lay是正方形的目标长度bool dfs(int pos,int cnt,int len,int lay){    if(cnt==3) return true;    if(len==lay) return dfs(0,cnt+1,0,lay); //搜索到一个边,接着从头再搜索下一个边    for(int i=pos; i<n; i++)    {        if(vis[i]) continue;        if(len+num[i]>lay) continue; //剪枝        vis[i]=1;        if(dfs(i+1,cnt,len+num[i],lay)) return true;        vis[i]=0;    }    return false;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        int sum=0;        for(int i=0; i<n; i++)        {            scanf("%d",&num[i]);            sum+=num[i];        }        if(sum%4)// 不能整除4 则为no        {            printf("no\n");            continue;        }        sort(num,num+n);        memset(vis,0,sizeof(vis));        if(dfs(0,0,0,sum/4)) printf("yes\n");        else printf("no\n");    }}


0 0
原创粉丝点击