Matchsticks to Square 火柴拼正方形
阿新 • • 發佈:2018-12-11
還記得童話《賣火柴的小女孩》嗎?現在,你知道小女孩有多少根火柴,請找出一種能使用所有火柴拼成一個正方形的方法。不能折斷火柴,可以把火柴連線起來,並且每根火柴都要用到。
輸入為小女孩擁有火柴的數目,每根火柴用其長度表示。輸出即為是否能用所有的火柴拼成正方形。
示例 1:
輸入: [1,1,2,2,2] 輸出: true 解釋: 能拼成一個邊長為2的正方形,每邊兩根火柴。
示例 2:
輸入: [3,3,3,3,4] 輸出: false 解釋: 不能用所有火柴拼成一個正方形。
注意:
- 給定的火柴長度和在
0
到10^9
之間。 - 火柴陣列的長度不超過15。
參考程式碼:
class Solution { public: bool makesquareCore(vector<int>& nums, vector<bool> &visited,int k,int start,int curSum,int target,int numbers) { if (curSum > target) return false; if (k == 0 && numbers == nums.size()) return true; if (curSum == target) return makesquareCore(nums, visited, k - 1, 0, 0, target,numbers); for (int i = start; i < nums.size(); i++) { if (!visited[i]) { visited[i] = true; if (makesquareCore(nums, visited, k, i + 1, curSum + nums[i], target,numbers+1)) return true; visited[i] = false; } } return false; } bool makesquare(vector<int>& nums) { if(nums.empty()) return false; int sum = 0; for (auto num : nums) sum += num; if (sum % 4 != 0) return false; sum = sum / 4; vector<bool> visited(nums.size(), false); return makesquareCore(nums,visited,4,0,0,sum,0); } };