C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でのDominoとTrominoのタイリング


ドミノとトロミノの2種類の形状があるとします。以下のように回転させることができます-

C++でのDominoとTrominoのタイリング

タイリングでは、すべての正方形をタイルで覆う必要があります。ここで、2つのタイルは、ボード上に2つの4方向に隣接するセルがあり、タイルの1つだけが両方の正方形をタイルで占めている場合にのみ異なります。

Nが与えられた場合、2xNボードをタイリングできる方法をいくつ見つける必要がありますか?したがって、入力が3の場合、出力は5になります。したがって、配置は[XYZ XXZ XYYXXYXYY]と[XYZYYZXZZ XYY XXY]になります。ここでは、タイルごとに異なる文字が使用されます。

これを解決するには、次の手順に従います-

  • サイズN+5のdpという配列を作成し、dp [1]:=1、dp [2]:=2およびdp[3]:=5

    を設定します。
  • 4からNの範囲のiの場合

    • dp [i]:=2 * dp [i – 1] + dp [i – 3]

  • dp [N]

    を返します

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
int add(int a, int b){
   return ((a % MOD) + (b % MOD)) % MOD;
}
class Solution {
   public:
   int numTilings(int N) {
      vector <int> dp(N + 5);
      dp[1] = 1;
      dp[2] = 2;
      dp[3] = 5;
      for(int i = 4; i <= N; i++){
         dp[i] = add(2 * dp[i - 1], dp[i - 3]);
      }
      return dp[N];
   }
};
main(){
   Solution ob;
   cout << (ob.numTilings(3));
}

入力

3

出力

5

  1. C++の壁と門

    1つのmxn 2Dグリッドがあり、それがこれら3つの可能な値で初期化されているとします。 -壁または障害物の場合は-1。 ゲートの場合は0。 INFこれは無限大は空の部屋を意味します。 ここで、2 ^ 31-1 =2147483647はINFです。これは、ゲートまでの距離が2147483647未満であると想定できるためです。空の各部屋に、最も近いゲートまでの距離を入力します。ゲートに到達できない場合は、INFで埋める必要があります。 したがって、入力が次のような場合 INF -1 0 INF INF INF INF -1

  2. C++で重複する円と長方形

    (radius、xc、yc)として表される円があると仮定します。ここで、(xc、yc)は円の中心座標です。また、(x1、y1、x2、y2)として表される軸に沿った長方形があります。ここで、(x1、y1)は左下隅の座標であり、(x2、y2)は右上隅の座標です。長方形の角。円と長方形が重なっていないか確認する必要があります。 したがって、入力が次のような場合 そうすれば、出力は真になります。 これを解決するには、次の手順に従います- 関数eval()を定義します。これには、a、b、c、が必要です。 bの最大値とaとcの最小値を返します メインの方法から、次のようにしま