POJ 2362 Square

来源:互联网 发布:如何自学ps软件 编辑:程序博客网 时间:2024/06/05 04:57

题目大意:

给定一些木棒,问是否可以用这些木棒头尾相连成一个正方形。

解题思路:

DFS+剪枝

本题可以理解为把这些木棒拼接成四根长度相同的大木棒,所有木棒的总长度sum为正方形周长,sum/4是变长

不难看出,小棒的长度越长,灵活性越差,由此,我们要对这些木棒进行降序排序,从最长的棒子DFS

剪枝:

1、要组合成正方形,必须满足sum%4==0;

2、所有小棒中最长的一根Max_length<=sum/4;

3、当满足1,2时,只需能组合成三条边,就能确定这些棒子能拼成正方形;

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;int n,sticks[30];int vis[30];int sum,num;bool cmp(int n,int m){    return n>m;}bool dfs(int num,int len,int st){  //num:已组合的正方形的边数;len:当前正在组合的边的已组合长度;                                    //st:sticks[]的搜索起点    if(num==3){            //剪枝3,当满足剪枝1和剪枝2的要求时,只需组合三条边,剩下的木棒必能组合成        return true;       //另一条边;    }    for(int i=st;i<n;i++){        if(vis[i]){            continue;        }        vis[i]=true;        if(len+sticks[i]<sum){            if(dfs(num,len+sticks[i],i+1))  //继续构建当前边                return true;        }        else if(len+sticks[i]==sum){            if(dfs(num+1,0,0)){    //构建新的边                return true;            }        }        vis[i]=false;    }    return false;}int main(){    int t;    scanf("%d",&t);    while(t--){        scanf("%d",&n);        sum=0;        for(int i=0;i<n;i++){            scanf("%d",&sticks[i]);            sum+=sticks[i];        }        if(sum%4){    //剪枝1            printf("no\n");            continue;        }        sort(sticks,sticks+n,cmp);           sum/=4;        num=0;        if(sticks[0]>sum){   //剪枝2            printf("no\n");            continue;        }        memset(vis,0,sizeof(vis));        if(dfs(0,0,0)){            printf("yes\n");        }        else{            printf("no\n");        }    }    return 0;}

参考博客:http://blog.csdn.net/lyy289065406/article/details/6647955

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小朋友上课注意力不集中怎么办 一年级孩子上课爱说话怎么办 一年级小孩不听老师话怎么办 大班幼儿规则意识差怎么办 幼儿大班《打雷了怎么办》的教案 小孩上课不听讲到处乱跑怎么办 小孩子经常咬人好动怎么办 6个月宝宝好动怎么办 新生调皮被幼儿园退学怎么办 孩子在幼儿园太调皮怎么办 幼儿上课注意力不集中怎么办 幼儿上课一半要离开怎么办 八个月宝宝消化不良拉肚子怎么办 8个月的宝宝拉肚子怎么办 孕8个月拉稀怎么办 孩子调皮好动爱说话怎么办 宝宝8个月不会爬怎么办 怀孕8个月不想要了怎么办 8个月宝宝发烧怎么办 八个月的小孩发烧怎么办 孩子8个月发烧38怎么办 8个宝宝发烧38度怎么办 怀孕八个月不想要怎么办 怀孕八个月不想要了怎么办 八个月宝宝拉肚子拉水怎么办 八个月的宝宝拉肚子怎么办 八个月发烧38度怎么办 孩子特别调皮好动该怎么办 孩子有好动症该怎么办 在幼儿园好动的孩子该怎么办 18个月宝宝上火怎么办 打孩子越打上瘾怎么办 八个月不想要了怎么办 胎儿心脏畸形肺动脉瓣闭锁怎么办 小孩爱动怎么办补什么 初中孩子下午上课总犯困怎么办 孩子上课精神不集中怎么办 孩子玩兴奋了就打人怎么办 婴儿兴奋白天不睡觉怎么办 小孩读书精神不集中怎么办 小孩上课精神不集中怎么办