分析
要组成正方形,那么要生成四条一样的边,相当于把n个火柴放到四个桶中,将总数和全部加起来,如果不能被4整除,说明不能均匀分配,返回false。否则进行dfs遍历,往每个桶中放入火柴。
class Solution {
public:
bool dfs(int cur,int target,vector<int>& matchsticks,vector<int>&bucket){
if(cur>=matchsticks.size())
return(bucket[0]==target&&bucket[1]==target&&bucket[2]==target);
for(int i=0;i<4;i++){
if(bucket[i]+matchsticks[cur]>target)continue;
bucket[i]+=matchsticks[cur];
if(dfs(cur+1,target,matchsticks,bucket))return true;
bucket[i]-=matchsticks[cur];
}
return false;
}
bool makesquare(vector<int>& matchsticks) {
if(matchsticks.size()<4)return false;
int sum=accumulate(matchsticks.begin(),matchsticks.end(),0);
if(sum%4)return false;
sort(matchsticks.begin(),matchsticks.end(),greater<int>());
vector<int> bucket(4);
return dfs(0,sum/4,matchsticks,bucket);
}
};