这题显然是一个暴搜题,显然,总的火柴的长度必须是4的倍数,否则肯定无法构成正方形。
另外,每一根火柴都必须被使用,每一个根火柴可以尝试放在4个边,因此火柴的个数就是层数,4个边就是每一层要枚举的东西。
只要一根火柴四个边都不能放,就证明这种是不可行的。
class Solution {
public:
bool makesquare(vector<int>& nums) {
if(nums.size()==0) return false;
int sum = 0;
for(auto num:nums) sum+=num;
if(sum%4) return false;
sort(nums.begin(),nums.end(), greater<int>());
int k = sum/4;
vector<int> side(4);
return dfs(nums,0,side,k);
}
bool dfs(vector<int>& nums, int index, vector<int>& side, int k){
if(index==nums.size()) return true;
for(int i=0;i<4;i++){
if(side[i]+nums[index]<=k){
side[i]+=nums[index];
if(dfs(nums,index+1,side,k)) return true;
side[i]-=nums[index];
}
}
return false;
}
};
这种写法会超时
class Solution {
public:
bool makesquare(vector<int>& nums) {
if(nums.size()==0) return false;
int sum = 0;
for(auto num:nums) sum+=num;
if(sum%4) return false;
sort(nums.begin(),nums.end(), greater<int>());
int k = sum/4;
vector<int> side(4);
dfs(nums,0,side,k);
return flag;
}
bool flag = false;
void dfs(vector<int>& nums, int index, vector<int>& side, int k){
if(index==nums.size()){
flag = true;
return;
}
for(int i=0;i<4;i++){
if(side[i]+nums[index]<=k){
side[i]+=nums[index];
dfs(nums,index+1,side,k);
side[i]-=nums[index];
}
}
return;
}
};