1. 使用4个数的数组分别记录每条边的增长情况
2. 遍历数组,如果一条边加上遍历的数不会超过划分边长,则加入这条边。
3. 递归处理下一个数。终止条件是遍历完后,4条边长度相等,返回true,否则返回false。
如果递归结果为false,则加步骤2中遍历到的数加入另外一条边,继续递归。
4. 一个加速的措施是遍历之前先将数组按照降序排列,这样每次选择是都优先选择较大的树加入一条边,时间复杂度降低。
class Solution { public: static bool comFunc(int a, int b) { return a > b; } bool makesquare(vector<int>& nums) { int n = nums.size(); if (n == 0) { return false; } int sumNum = 0; for (int i = 0; i < n; i++) { sumNum += nums[i]; } if (sumNum % 4 != 0) { return false; } print_vec(nums); sort(nums.begin(), nums.end(), comFunc); print_vec(nums); vector<int> sums = vector<int>(4, 0); return dfs(nums, sums, 0, sumNum / 4); } bool dfs(vector<int>& nums, vector<int>& sums, int index, int target) { if (index == nums.size()) { if (sums[0] == target && sums[1] == target && sums[2] == target && sums[3] == target) { return true; } return false; } for (int i = 0; i < 4; i++) { if (sums[i] + nums[index] > target) continue; sums[i] += nums[index]; if (dfs(nums, sums, index+1, target)) return true; sums[i] -= nums[index]; } return false; } };
