已知一个数组,保存了n个(n<=15)火柴棍,问可否使用这n个火柴棍摆成1个正方形?
[1,1,2,2,2]: true
[3,3,4,4,4]: false
[1,1,2,4,3,2,3]: true

方法一:优化与剪枝+深度搜索

#include <vector>
#include<algorithm>
class Solution
{public:Solution() {}~Solution() {}bool makesquare(std::vector<int>& nums){if (nums.size()<4){return false;}int sum = 0;for (int i = 0; i < nums.size(); i++){sum += nums[i];}if (sum%4){return false;}std::sort(nums.rbegin(), nums.rend());int bucket[4] = { 0 };return generate(0, nums, sum/4, bucket);}
private:bool generate(int i, std::vector<int>& nums, int target, int bucket[]){if (i>=nums.size()){return bucket[0] == target && bucket[1] == target && bucket[2] == target && bucket[3] == target;}for (int j = 0; j < 4; j++){if ((bucket[j]+nums[i])>target){continue;}bucket[j] += nums[i];if (generate(i+1, nums, target, bucket)){return true;}bucket[j] -= nums[i];}return false;}
};
int main()
{std::vector<int> nums;nums.push_back(1);nums.push_back(1);nums.push_back(2);nums.push_back(4);nums.push_back(3);nums.push_back(2);nums.push_back(3);Solution solve;printf("%d\n", solve.makesquare(nums));return 0;
}

运行结果:

1

方法二:位运算

#include<vector>
class Solution
{public:Solution() {}~Solution() {}bool makesquare(std::vector<int>& nums){if (nums.size()<4){return false;}int sum = 0;for (int i = 0; i < nums.size(); i++){sum += nums[i];}if (sum%4){return false;}int target = sum / 4;std::vector<int> ok_set;std::vector<int> half_set;int all = 1 << nums.size();for (int i = 0; i < all; i++){int sum = 0;for (int j = 0; j < nums.size(); j++){if (i&(1<<j)){sum += nums[j];}}if (sum==target){ok_set.push_back(i);}}for (int i = 0; i < ok_set.size(); i++){for (int j = i+1; j < ok_set.size(); j++){if ((ok_set[i]&ok_set[j])==0){half_set.push_back(ok_set[i]|ok_set[j]);}}}for (int i = 0; i < half_set.size(); i++){for (int j = i+1; j < half_set.size(); j++){if ((half_set[i]&half_set[j])==0){return true;}}}return false;}
};
int main()
{std::vector<int> nums;nums.push_back(1);nums.push_back(1);nums.push_back(2);nums.push_back(4);nums.push_back(3);nums.push_back(2);nums.push_back(3);Solution solve;printf("%d\n", solve.makesquare(nums));return 0;
}

运行结果为:

1

C++ 火柴棍摆正方形相关推荐

  1. 贪心算法 | 473火柴拼正方形 怎么用C++实现摆放火柴棍?

    题目 已知一个数组,保存了n个(n<=15)火柴棍,问可否使用这n个火柴棍摆成一个正方形? 例如:[1,1,2,2,2] --true  2 求解 思路 num[i] :第i条火柴棍 bucke ...

  2. 移动火柴棍生成最大数和最小数

    题目: 编写程序为火柴棍摆成的任意自然数生成一个最大数和最小数 原题:用火柴棍摆成自然数"1995",移动任意一根火柴得到最大数和最小数分别是多少. 程序结果: 火柴数字参考图: ...

  3. 2022-10-21:你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。 你要用 所有的火柴棍 拼成一个正方形。 你 不能折断 任何一根火柴

    2022-10-21:你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度. 你要用 所有的火柴棍 拼成一个正方形. 你 不能折断 任何一根火柴 ...

  4. 搜索法求解火柴棍等式问题 基于python

    完整代码:https://download.csdn.net/download/pythonyanyan/87430541 任务描述 1.1 作业要求 用火柴棍可以摆成一个数字等式,希望移动一根火柴使 ...

  5. c语言假设有21根火柴棍,10道火柴棍趣味智力题,据说全对的都是天才!

    原标题:10道火柴棍趣味智力题,据说全对的都是天才! 各位小朋友及大朋友们,晚上好!欢迎来到科学有意思栏目.发现身边有趣的科学现象,激发孩子好奇心! 相信很多80后的朋友们,小时候一定和同学玩过各种趣 ...

  6. “火柴棍式”程序员面试题

    转自:http://coolshell.cn/articles/3961.html 有时候,有些面试题是很是无厘头,这不,又有一个,还记得小时候玩的的"火柴棍游戏"吗,就是移动一根 ...

  7. BZOJ3324 : [Scoi2013]火柴棍数字

    为了使数字最大,首先要最大化其位数. 设$f[i][j][k]$表示从低到高考虑了$i$位,手头火柴棍个数为$j$,第$i$位是不是$0$时,最少移动多少根火柴. 若$f[i][0][非0]\leq ...

  8. 倒推法解决“四人玩火柴棍游戏,每一次都是三个人赢,一个人输”问题

    问题:四人玩火柴棍游戏,每一次都是三个人赢,一个人输.输的人要按赢者手中的火柴数进行赔偿,即赢者手中有多少根火柴棍,输者就赔偿多少根.现知道玩过四次后,每人恰好输过一次, 而且每人手中都正好有16根火 ...

  9. 火柴棍能组成的最大数字

    火柴棍能组成的最大数字 2020春招百度笔试题 题目: 输入火柴棍根数n,能选取的数字个数m,以及能选取的数字列表 输入案例(原题案例我忘了,瞎写的) 20 4 5 6 7 8 输出能组成的最大整数值 ...

最新文章

  1. 如何为ccflow工作流引擎增加一个优先级PRI?
  2. 影像锐化工具_如何以及为什么要进行工具改造:花在锐化斧头上的时间永远不会浪费...
  3. 理解并解决IE的内存泄漏方式[翻译2]
  4. 神经网络原来这么简单,机器学习入门贴送给你 | 干货
  5. 【计算机网络】网络层 : ICMP 协议 ( ICMP 差错报文 | 差错报文分类 | ICMP 询问报文 | ICMP 应用 | Ping | Traceroute )
  6. Oracle 原理:复杂的SQL语句
  7. 51单片机学习笔记(郭天祥版)(9)——IIC、EEPROM
  8. python dictwriter_手把手教你写爬虫 |Python 采集大众点评数据采集实战
  9. php 正规标题,一些PHP面试标题
  10. 总结面试题——Javascript
  11. Linux高级权限管理
  12. webstorm怎样查找历史记录
  13. 电脑快捷键(键盘不灵了赶紧使用快捷键)
  14. [书目20080630]人一生要养成的50个习惯
  15. linux 驱动安装带参数,【转】Intel Linux显卡驱动安装指南
  16. 如何判断一家软件公司是否靠谱
  17. vue 时间格式总结及转换
  18. Unity版本升级指南 从unity xx 到 unity 20xx
  19. 与激光雷达死磕的毫米波雷达,除了无人驾驶还有更多归宿
  20. 长沙云栖谷交通事故_长沙含浦片区自发成立抗洪救灾志愿者服务队转移被困群众(组图)...

热门文章

  1. java 最大最小聚类,最大最小距离算法(K-MEANS K-medoids )聚类算法的结合运用
  2. 算法题:给出一组数字,拼接一个最大的值
  3. 《30天精通iPhone手机编程》-Day20-DJ混音器
  4. Windows系统安装下载工具Internet Download Manager(IDM)6.41及配置使用
  5. jQuery+PHP实现砸金蛋抽奖
  6. 利用InstallAnywhere 打包java程序
  7. 大数据导出excel大小限制_大数据量导出Excel的方案
  8. 算法提高:贪心策略的11个经典题目
  9. workman php开源服务器框架初学(一)
  10. 利用微信公众号搭建天气查询