• 火柴拼正方形


    还记得童话《卖火柴的小女孩》吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法。不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到。

    输入为小女孩拥有火柴的数目,每根火柴用其长度表示。输出即为是否能用所有的火柴拼成正方形。

    示例 1:

    输入: [1,1,2,2,2]
    输出: true

    解释: 能拼成一个边长为2的正方形,每边两根火柴。
    示例 2:

    输入: [3,3,3,3,4]
    输出: false

    解释: 不能用所有火柴拼成一个正方形。
    注意:

    给定的火柴长度和在 0 到 10^9之间。
    火柴数组的长度不超过15。

    code:

    class Solution {
    private:
        bool dfs(const vector<int>& nums,int start,int end,int e1,int e2,int e3,int e4)
        {
            if(e1<0||e2<0||e3<0||e4<0)
                return false;
            if(start==end+1)
            {
                if(e1==0&&e2==0&&e3==0&&e4==0)
                    return true;
                return false;
            }
            return dfs(nums,start+1,end,e1-nums[start],e2,e3,e4)||
                   dfs(nums,start+1,end,e1,e2-nums[start],e3,e4)||
                   dfs(nums,start+1,end,e1,e2,e3-nums[start],e4)||
                   dfs(nums,start+1,end,e1,e2,e3,e4-nums[start]);
        }
    public:
        bool makesquare(vector<int>& nums) {
            if(nums.size()<4)
                return false;
    
            int numSum=accumulate(nums.begin(),nums.end(),0);
            int edgLen=numSum/4;
            if(edgLen*4!=numSum)
                return false;
            
            sort(nums.begin(),nums.end(),greater<int>());
            return dfs(nums,0,nums.size()-1,edgLen,edgLen,edgLen,edgLen);
        }
    };
  • 相关阅读:
    FLASH置于底层
    图片等比缩放
    fedora 系统使用 Broadcom BCM4312 无线网卡(转)
    ubuntu语言问题
    轻松安装、卸载Linux软件
    redhat6.0下使用vnc
    http网络安装centos 5.5系统总结
    如何在windows下搭建python的IDE开发环境
    对做技术的一点思考
    C++继承类和基类之间成员函数和虚函数调用机制
  • 原文地址:https://www.cnblogs.com/tianzeng/p/12667608.html
Copyright © 2020-2023  润新知