Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 Square에 성냥개비

<시간/>

작은 성냥개비 소녀가 있다고 가정해 봅시다. 그리고 우리는 성냥개비 소녀가 가지고 있는 성냥개비를 정확히 알고 있습니다. 우리는 성냥개비를 모두 사용하여 정사각형 하나를 만들 수 있는 방법을 찾아야 합니다. 막대기를 부러뜨리면 안되지만 연결할 수 있으며 각 성냥개비는 정확히 한 번만 사용해야 합니다. 우리의 입력은 소녀가 가지고 있는 여러 성냥개비로, 막대기 길이로 표시됩니다. 우리의 출력은 성냥개비 소녀가 가지고 있는 모든 성냥개비를 사용하여 하나의 정사각형을 만들 수 있는지 여부를 나타내기 위해 true 또는 false가 될 것입니다. 따라서 입력이 [1,1,2,2,2]와 같으면 답은 참이 됩니다. 길이가 2인 정사각형을 만들 수 있으므로 한 변에는 길이가 1인 막대가 두 개 있습니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • solve()라는 재귀 메서드를 정의합니다. 이것은 인덱스, 합계 배열, 대상 및 숫자 배열을 사용합니다. 따라서 이것은 다음과 같이 작동합니다 -
  • 인덱스>=숫자 크기인 경우
    • sum[0], sum[1], sum[2]가 모두 targer와 같으면 true를 반환합니다.
  • 0에서 3 사이의 i에 대해 -
    • sums[i] + nums[index]> target이면 루프의 다음 부분을 건너뜁니다.
    • 합[i] :=합[i] + 숫자[색인]
    • solve(index + 1, sums, target, nums)가 true이면 true를 반환합니다.
    • 합[i] :=합[i] – 숫자[색인]
  • 거짓 반환
  • 메인 방법에서 다음을 수행하십시오. -
  • nums에 요소가 없으면 false를 반환합니다.
  • x :=0
  • 0에서 숫자 크기까지 범위에 있는 i의 경우 x를 숫자만큼 증가[j]
  • x가 4로 나누어 떨어지면 false를 반환합니다.
  • nums 배열 정렬
  • 크기 4의 배열 합계 만들기
  • 해결(0, 합계, x/4, 숫자) 반환

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool solve(int idx, vector <int>& sums, int target, vector <int>& nums){
      if(idx >= nums.size()){
         return sums[0] == sums[1] && sums[1] == sums[2] && sums[2] == target;
      }
      for(int i = 0; i < 4; i++){
         if(sums[i] + nums[idx] > target)continue;
         sums[i] += nums[idx];
         if(solve(idx + 1, sums, target, nums)) return true;
         sums[i] -= nums[idx];
      }
      return false;
   }
   bool makesquare(vector<int>& nums) {
      if(nums.size() == 0) return false;
      int x = 0;
      for(int i = 0; i < nums.size(); i++){
         x += nums[i];
      }
      if(x % 4) return false;
      sort(nums.rbegin(), nums.rend());
      vector <int> sum(4);
      return solve(0, sum,x / 4, nums);
   }
};
main(){
   vector<int> v = {1,1,2,2,2};
   Solution ob;
   cout << (ob.makesquare(v));
}

입력

[1,1,2,2,2]

출력

1