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

C++에서 가장 적은 사각형으로 사각형 타일링하기

<시간/>

크기가 n x m인 직사각형이 있다고 가정합니다. 직사각형을 타일링할 수 있는 정사각형 개체의 최소 개수를 찾아야 합니다.

따라서 입력이 n =2 및 m =3인 경우

C++에서 가장 적은 사각형으로 사각형 타일링하기

3개의 블록이 필요하므로 출력은 3이 됩니다.

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

  • 하나의 맵 정의

  • res :=inf

  • dfs() 함수를 정의하면 n, m, 배열 h, cnt,

    가 필요합니다.
  • cnt>=res이면 -

    • 반환

  • isFull :=참

  • 위치 :=-1, 최소H :=정보

  • initialize i :=1의 경우, i <=n일 때 업데이트(i를 1만큼 증가), −

    • h[i]

      • isFull :=거짓

    • h[i]

      • minH :=h[i]

      • 위치 :=나는

  • isFull이 0이 아니면 -

    • res :=res 및 cnt의 최소값

    • 반환

  • 키 :=0

  • 기본 :=m + 1

  • initialize i :=1의 경우, i <=n일 때 업데이트(i를 1만큼 증가), −

    • 키 :=키 + h[i] * 기본

    • 기본 :=기본 * (m + 1)

  • 키가 s 및 s[key] <=cnt에 있으면 -

    • 반환

  • s[키] :=cnt

  • 끝 :=위치

  • 동안 (end + 1 <=n 및 h[end + 1]은 h[pos]와 동일하고 (end + 1 - pos + 1 + minH)

  • <=m), ~

    • (끝을 1씩 증가)

  • 초기화 j :=end, j>=pos일 때 업데이트(j를 1만큼 감소), −

    • curH :=j - 위치 + 1

    • n + 1 크기의 배열을 정의하십시오.

    • initialize i :=1의 경우, i <=n일 때 업데이트(i를 1만큼 증가), −

      • 다음[i] :=h[i]

    • 초기화 k :=pos의 경우 k <=j일 때 업데이트(k를 1만큼 증가), −

      • 다음[k] :=다음[k] + curH

    • dfs(n, m, 다음, cnt + 1)

  • 주요 방법에서 다음을 수행하십시오 -

  • n이 m과 같으면 -

    • 1 반환

  • n> m이면

    • 스왑(n, m)

  • n + 1 크기의 배열 h 정의

  • dfs(n, m, h, 0)

  • 반환 해상도

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   map<int, int> s;
   int res = INT_MAX;
   void dfs(int n, int m, vector<int> h, int cnt){
      if (cnt >= res)
         return;
      bool isFull = true;
      int pos = -1, minH = INT_MAX;
      for (int i = 1; i <= n; i++) {
         if (h[i] < m)
            isFull = false;
         if (h[i] < minH) {
            minH = h[i];
            pos = i;
         }
      }
      if (isFull) {
         res = min(res, cnt);
         return;
      }
      long key = 0;
      long base = m + 1;
      for (int i = 1; i <= n; i++) {
         key += h[i] * base;
         base *= m + 1;
      }
      if (s.find(key) != s.end() && s[key] <= cnt)
         return;
      s[key] = cnt;
      int end = pos;
      while (end + 1 <= n && h[end + 1] == h[pos] && (end + 1 - pos + 1 + minH) <= m)
      end++;
      for (int j = end; j >= pos; j--) {
         int curH = j - pos + 1;
         vector<int> next(n + 1);
         for (int i = 1; i <= n; i++)
            next[i] = h[i];
         for (int k = pos; k <= j; k++) {
            next[k] += curH;
         }
         dfs(n, m, next, cnt + 1);
      }
   }
   int tilingRectangle(int n, int m){
      if (n == m)
         return 1;
      if (n > m)
         swap(n, m);
      vector<int> h(n + 1);
      dfs(n, m, h, 0);
      return res;
   }
};
main(){
   Solution ob;
   cout << (ob.tilingRectangle(2, 3));
}

입력

2,3

출력

3