你将得到一个整数数组 matchsticks ,其中 matchsticks[i] 是第 i 个火柴棒的长度。你要用 所有的火柴棍 拼成一个正方形。你 不能折断 任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须 使用一次 。
如果你能使这个正方形,则返回 true ,否则返回 false 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/matchsticks-to-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
dfs+剪枝
class Solution {
public:
int l = 0;
int sum = 0;
int bucket[4];
vector<int> matchsticks_;
int target = 0;
bool dfs(int i) {
if (i == l) return true;
for (int j = 0; j < 4; j++) {
if (j && bucket[j] == bucket[j - 1]) continue;
if (bucket[j] + matchsticks_[i] <= target) {
bucket[j] += matchsticks_[i];
if (dfs(i + 1)) return true;
bucket[j] -= matchsticks_[i];
}
}
return false;
}
bool makesquare(vector<int>& matchsticks) {
matchsticks_ = matchsticks;
l = matchsticks_.size();
sum = 0;
for (auto i : matchsticks_)
sum += i;
if (sum % 4 || l < 4) return false;
memset(bucket, 0, sizeof(bucket));
target = sum / 4;
sort(matchsticks_.begin(), matchsticks_.end(), greater<int>());
if (matchsticks_[0] > target) return false;
return dfs(0);
}
};