leetcode 火柴拼正方形 深搜

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

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

示例?1:

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

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/matchsticks-to-square

思路:1.人为规定每个边长由长火柴开始填(避免更多的情况
2.大顺序每个边长的枚举
3.剪枝:当一个长度的火柴失败之后,与之长度相同的火柴都不行,跳过这些情况;如果组成当前边长火柴是第一个或最后一个,却失败之后,那麽这个大情况就不行,必须全部剪掉

class Solution {
public:
    vector<bool> st;
    bool makesquare(vector<int>& nums) {
        int sum=0;
        st=vector<bool>(nums.size());
        sort(nums.begin(),nums.end());
        reverse(nums.begin(),nums.end());
        for(auto t:nums)sum+=t;
        if(sum%4||!nums.size())return false;
        return dfs(0,0,sum/4,nums,0);
    }
    bool dfs(int cur,int len,int max_len,vector<int>& nums,int start){
        if(cur==4)return true;
        if(len==max_len)return dfs(cur+1,0,max_len,nums,0);
        for(int i=start;i<nums.size();++i){
            if(!st[i]&&len+nums[i]<=max_len){
                st[i]=true;
                if(dfs(cur,len+nums[i],max_len,nums,i+1))return true;
                st[i]=false;
                if(!len)return false;
                if(len+nums[i]==max_len)return false;
                while(i+1<nums.size()&&nums[i+1]==nums[i])i++;
            }
        }
        return false;
    }
};

原文地址:https://www.cnblogs.com/clear-love/p/11370029.html

时间: 2024-07-31 14:58:39

leetcode 火柴拼正方形 深搜的相关文章

Leetcode 473.火柴拼正方形

火柴拼正方形 还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法.不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到. 输入为小女孩拥有火柴的数目,每根火柴用其长度表示.输出即为是否能用所有的火柴拼成正方形. 示例 1: 输入: [1,1,2,2,2] 输出: true 解释: 能拼成一个边长为2的正方形,每边两根火柴. 示例 2: 输入: [3,3,3,3,4] 输出: false 解释: 不能用所有火柴拼成一个正方形. 注意:

[Swift]LeetCode473. 火柴拼正方形 | Matchsticks to Square

Remember the story of Little Match Girl? By now, you know exactly what matchsticks the little match girl has, please find out a way you can make one square by using up all those matchsticks. You should not break any stick, but you can link them up, a

473. 火柴拼正方形

1 class Solution 2 { 3 public: 4 bool makesquare(vector<int>& nums) 5 { 6 if(nums.size()<4) return false; 7 int sum=0; 8 for(int i=0;i<nums.size();i++) sum+=nums[i]; 9 if(sum%4 != 0) return false; 10 sort(nums.rbegin(),nums.rend());//最神奇的一

leetcode 深搜广搜

遍历整个grid数组,当发现有1的时候,就把和这个1连成片的1都置为0,并增加一个计数.最后返回这个计数. 广搜,但这个代码通不过测试,栈溢出. class Solution { public: void bfs(vector<vector<char>>& grid,int i,int j){ if(i<0||j<0||i>=grid.size()||j>=grid[0].size()) return; if(grid[i][j]=='0') ret

【Leetcode 深搜】统计封闭岛屿的数目(1254)

题目 有一个二维矩阵 grid?,每个位置要么是陆地(记号为?0 )要么是水域(记号为?1 ). 我们从一块陆地出发,每次可以往上下左右?4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」. 如果一座岛屿?完全?由水域包围,即陆地边缘上下左右所有相邻区域都是水域,那么我们将其称为 「封闭岛屿」. 请返回封闭岛屿的数目. 示例 1: 输入:grid = [[1,1,1,1,1,1,1,0], [1,0,0,0,0,1,1,0], [1,0,1,0,1,1,1,0], [1,0,0

hdu1455 Sticks 深搜 强剪枝

Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6035    Accepted Submission(s): 1704 Problem Description George took sticks of the same length and cut them randomly until all parts becam

A Knight&#39;s Journey(DFS)深搜

A Knight's Journey Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 33634 Accepted: 11450 Description Background The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey around

poj1011(深搜+剪枝)

题意:给m根木棍,将它们重新拼成n根一样长的木棍,并使得n尽量大(即每个新木棍尽量短). 解法:经典的搜索题目.从小到大枚举拼成的新木棍长度,每次枚举进行一次深搜.这题关键是如何剪枝. 1.当枚举的长度不能整除总长度的时候,剪枝:(这个很显然) 2.先将木棍从长到短排序,枚举时先尝试长的木棍.(先枚举长的可以使得搜索深度不至于过深) 3.深搜时,不要企图通过换掉一个新木棍的第一根来改变失败的局面(换掉第一根A,那么A也会在以后的新木棍中被使用,但是已经证明了A无法拼成了,所以不必再尝试下去了)

深搜整理汇总

2801 LOL-盖伦的蹲草计划 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 众所周知,LOL这款伟大的游戏,有个叫盖伦的英雄.他的伟大之处在于他特别喜欢蹲草丛阴人(XL:蹲草阴人也算英雄?!CZQ:没办法,个个都是这么玩的).某日,德玛西亚与诺克萨斯之间又发生了一场战斗,嘉文四世希望盖伦能带领一支K人的德玛西亚军队出战. 战斗发生在召唤师峡谷.整个召唤师峡谷被分割成M行N列的一个矩阵,矩阵中有空地和几片草丛.这几片草丛中有