童話「マッチ売りの少女」それを覚えていますか?今、あなたは多くの女の子が試合を持っているか知っていること、すべてが二乗法を構成するために試合を使用することができます見つけてください。試合を壊すことができない、試合を接続することができ、そして各一致を使用する必要があります。
女の子は、入力にマッチの数、それらの長さによって示される各マッチを有します。あなたはすべての試合が正方形のスペルを使用できるかどうかで出力。
例1:
入力:[1,1,2,2,2-]
出力:真
説明:エネルギーが2の正方形の辺の長さを構成する、各側面上の2つのマッチ。
例2:
入力:[3,3,3,3,4]
出力:偽
説明:あなたはすべての一致の正方形を綴ることができません。
出典:滞在ボタン(LeetCode)
リンク:https://leetcode-cn.com/problems/matchsticks-to-square
アイデア:1.ヒト所定の長さは、各辺の長さが(複数の場合を避けるために充填を開始一致
大列挙のための各辺の長さ2.
3.プルーニング:マッチが同じ長さで、長さが失敗した後試合はこのような状況をスキップし、機能しません。試合の辺の長さの現在の組成物は、最初または最後が、障害が発生した後であるので、この状況は大きくない場合、あなたはすべて遮断しなければなりません
class Solution {
public:
vector<bool> st;
bool makesquare(vector<int>& nums) {
int sum=0;
st=vector<bool>(nums.size());
sort(nums.begin(),nums.end());
reverse(nums.begin(),nums.end());
for(auto t:nums)sum+=t;
if(sum%4||!nums.size())return false;
return dfs(0,0,sum/4,nums,0);
}
bool dfs(int cur,int len,int max_len,vector<int>& nums,int start){
if(cur==4)return true;
if(len==max_len)return dfs(cur+1,0,max_len,nums,0);
for(int i=start;i<nums.size();++i){
if(!st[i]&&len+nums[i]<=max_len){
st[i]=true;
if(dfs(cur,len+nums[i],max_len,nums,i+1))return true;
st[i]=false;
if(!len)return false;
if(len+nums[i]==max_len)return false;
while(i+1<nums.size()&&nums[i+1]==nums[i])i++;
}
}
return false;
}
};