luogu P2383 狗哥玩木棒

题目背景

狗哥又趁着语文课干些无聊的事了…

题目描述

现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢?

输入格式:
输入文件中的第一行是一个整数n表示测试的组数,接下来n行表示每组的测试数据。 每行的第一个数为m(4<=m<=20),接下来m个数ai(1<=ai<=1000)表示木棒的长度。

输出格式:
对于每组测试数据,如果可以组成正方形输出“yes”,否则输出“no”。

说明
狗哥快抓狂了


普通搜索+略微剪枝

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int n,t,sum,f,cnt;//木棍数,询问次数,总长度,标记是否达成条件,当前边的长度
int len[25],che[25];//长度数组,标记是否被用过
void dfs(int e,int num,int cnt){//dfs
    if(num==4){//如果达成就标记f=1并输出
        f=1;
        cout<<"yes"<<endl;
        return;
    }
    for(int i=1;i<=n;i++){//遍历每条木棍
        if(!che[i]&&cnt+len[i]<=e){//如果未用过且不超出目标边长
            che[i]=1;//标记为用过
            if(cnt+len[i]==e) dfs(e,num+1,0);//如果当前边长正好达成,搜下一边,边长贵0
            else dfs(e,num,cnt+len[i]);//继续搜此边
            che[i]=0;//还原
            if(f==1) return;//玄学退出函数,加速
        }
    }
    return;
}

int main(){
    memset(len,0,sizeof(len));
    memset(che,0,sizeof(che));
    cin>>t;//读入询问次数
    while(t--){
        cin>>n;//当前询问的木棍数
        for(int i=1;i<=n;i++){
            cin>>len[i];//读入长度
            sum+=len[i];//求木棍总长
        }
        sort(len+1,len+n+1);//排序
        if(len[n]>sum/4||sum%4!=0){//剪枝,如果最长边已超过目标边长||总长度不能被4整除就不必再搜
            cout<<"no"<<endl;
            sum=0;
            memset(len,0,sizeof(len));//清空是个好习惯
            continue;
        }
        dfs(sum/4,0,0);//目标边长,边数,当前边长度
        if(!f) cout<<"no"<<endl;//无法达成
        f=0;
        sum=0;//清空
        memset(len,0,sizeof(len));
    } 
    return 0;
}

ps1:写代码一定要认真,不然会两个小时一道水题
ps2:题目名字取得很好(逃

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值