题目链接

473. 火柴拼正方形

题意

给定一串数,判断这串数字能不能拼接成为正方形

思路

DFS,但是不能每次从从序列开始往下搜索,因为这样无法做到四个边覆盖不同位置的值,比如输入是(5,5,5,5,4,4,4,4,3,3,3,3)这种情况

以四条边分类讨论,每次加入序列的值,最后判断四条边的结果是否相等

其次注意剪枝:

  • 首先将序列逆序排列,尤其遇到(1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4....),如果正着搜索那么一定会超时
  • 每一轮检查每条边加上序列的值,得到的结果如果大于边长,那么直接剪枝
  1. class Solution {
  2. public:
  3. int avr=-1;
  4. bool dfs(vector<int> nums,int pos,int cnt[4]){
  5. if(pos==-1){
  6. return cnt[0]==cnt[1] && cnt[1]==cnt[2] && cnt[2]==cnt[3] && cnt[3]==avr;
  7. }
  8. //对每一个段的值进行统计
  9. for(int i=0;i<4;i++){//对每一段分别统计
  10. if(cnt[i]+nums[pos]>avr) continue;//剪枝
  11. cnt[i]+=nums[pos];
  12. if(dfs(nums,pos-1,cnt)) return true;
  13. cnt[i]-=nums[pos];
  14. }
  15. return false;
  16. }
  17. bool makesquare(vector<int>& nums) {
  18. int sum=0;
  19. for(int num:nums) sum+=num;
  20. if(sum%4!=0) return false;
  21. if(!nums.size()) return false;//特判一下[]
  22. avr=sum/4;
  23. sum=0;
  24. //排序一下,减少调用次数,从大到小调用,类似于剪枝
  25. sort(nums.begin(),nums.end());
  26. int cnt[4]={0};
  27. return dfs(nums,nums.size()-1,cnt);
  28. }
  29. // bool dfs(vector<int> nums,int sum,int pos,int cnt){ //记录四条边的长度
  30. // if(sum>avr) return false;
  31. // if(sum==avr) {
  32. // cnt++;
  33. // sum=0;
  34. // }
  35. // if(pos==nums.size()){
  36. // if(cnt==4) return true;
  37. // else return false;
  38. // }
  39. // for(int i=pos;i<nums.size();i++){
  40. // sum+=nums[i];
  41. // if(dfs(nums,sum,i+1,cnt)) return true;//只能判断连续的值
  42. // sum-=nums[i];
  43. // }
  44. // return false;
  45. // }
  46. // bool dfs(vector<int> nums,vector<int> tmp,int pos){
  47. // if(tmp.size() && tmp[tmp.size()-1]>avr) return false;
  48. // if(tmp.size()>4) return false;
  49. // if(tmp.size()==4){
  50. // if(tmp[0]==tmp[1] && tmp[1]==tmp[2] && tmp[2]==tmp[3] &&tmp[0]==avr) return true;
  51. // return false;
  52. // }
  53. // for(int i=pos;i<nums.size();i++){//顺序不是连在一起的
  54. // tmp.push_back()
  55. // }
  56. // return false;
  57. // }
  58. // bool dfs(vector<int> nums,int pos,vector<int> cnt(4,0)){//每一部分的和
  59. };

leetcode 473. 火柴拼正方形(DFS,回溯)的更多相关文章

  1. Java实现 LeetCode 473 火柴拼正方形

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

  2. Leetcode 473.火柴拼正方形

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

  3. Leetcode之深度优先搜索(DFS)专题-473. 火柴拼正方形(Matchsticks to Square)

    Leetcode之深度优先搜索(DFS)专题-473. 火柴拼正方形(Matchsticks to Square) 深度优先搜索的解题详细介绍,点击 还记得童话<卖火柴的小女孩>吗?现在, ...

  4. 473 Matchsticks to Square 火柴拼正方形

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

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

    Remember the story of Little Match Girl? By now, you know exactly what matchsticks the little match ...

  6. LeetCode刷题 DFS+回溯

    一.DFS介绍 二.LeetCode 实战 LC 17. 电话号码的字母组合 解法思路 解题步骤 代码 LC 79. 单词搜索 解题思路 解题步骤 代码 LC 46. 全排列 解题思路一 解题步骤 代 ...

  7. [LeetCode] 79. 单词搜索(DFS,回溯)

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

  8. [leetcode] 39. 组合总和(Java)(dfs、递归、回溯)

    39. 组合总和 直接暴力思路,用dfs+回溯枚举所有可能组合情况.难点在于每个数可取无数次. 我的枚举思路是: 外层枚举答案数组的长度,即枚举解中的数字个数,从1个开始,到target/ min(c ...

  9. 【POJ - 3009】Curling 2.0 (dfs+回溯)

    -->Curling 2.0 直接上中文 Descriptions: 今年的奥运会之后,在行星mm-21上冰壶越来越受欢迎.但是规则和我们的有点不同.这个游戏是在一个冰游戏板上玩的,上面有一个正 ...

随机推荐

  1. svn提交时提示 Aborting commit: remains in conflict 解决办法,更改svn服务地址

    TortoiseSVN客户端如何更改新的URL 问题: 我们的服务器换了新的URL地址,这时候我们本地的SVN访问帐号和地址就要重新定义了. 解决步骤: 1:重新定义SVN的URL,右键(Tortoi ...

  2. 精尽Spring MVC源码分析 - HandlerMapping 组件(二)之 HandlerInterceptor 拦截器

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  3. vue第十一单元(内置组件)

    第十一单元(内置组件) #课程目标 熟练掌握component组件的用法 熟练使用keep-alive组件 #知识点 #1.component组件 component是vue的一个内置组件,作用是:配 ...

  4. [OI笔记]三种逆元的求法

    其实这篇博客只是搬运一下我之前(大概是NOIP那会)写在word里的笔记- 下面直接复制原话,题目是洛谷上求逆元的模板题:https://www.luogu.org/problemnew/show/P ...

  5. Flink内存溢出

    Flink内存模型 此图是基于flink1.12版本. 一个taskmanager给了6g内存,可以有很清楚的看到各个部分占用的内存,还是实时变化的. 名词解释 组件 配置项 描述 Framework ...

  6. Linux 修改权限,查看进程,结束进程 命令

    在linux终端先输入ll,可以看到bai如:-rwx-r--r-- (一共10个参数) 表示文件所属组和du用户的对应权限.zhi第一个跟dao参数属于管理员,跟chmod无关,先不管.2-4参数: ...

  7. kali没有tcptraceroute如何安装

    问题描述 尝试使用kali进行路由信息的收集,发现kali没有自带tcptraceroute.在网上搜索教程发现都是Linux下安装,且都是使用yum安装,看了一下发现kali用的也不是yum 这就很 ...

  8. VMware虚拟机安装Win7填坑

    今天本想赶紧安装Win7虚拟机做个实验,结果鼓捣了一天,写个文章填下坑. 一.Win7镜像文件下载 下载ISO镜像地址:http://msdn.itellyou.cn/ 二.安装tools VMwar ...

  9. 第 12 章 JVM执行引擎

    目录 第 12 章 执行引擎 1.执行引擎概述 1.1.执行引擎概述 1.2.执行引擎工作过程 2.Java 代码编译和执行过程 2.1.解释执行和即时编译 2.2.解释器和编译器 3.机器码 指令 ...

  10. 4.mysql profile的使用方法

    profile的使用 1.作用 使用profile可以对某一条sql性能进行分析 2.语法 mysql> show variables like '%profil%'; +----------- ...