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

C++で1×mサイズのタイルを使ってn×mの床を敷き詰める方法の数を数える


問題概要

部屋の床の長さと幅を表す 2 つの整数 n と m が与えられます。この床をサイズ 1×m のタイルで敷き詰める方法が何通りあるかを数えることが目的です。

入力例 1

n=3 m=2

出力例 1

1 x m サイズのタイルを使用して n x m の床を敷き詰める方法の数は:3

説明

下図のように、1×2 のタイル 3 枚を並べる方法が 3 通り存在します。

C++で1×mサイズのタイルを使ってn×mの床を敷き詰める方法の数を数える

入力例 2

n=3 m=3

出力例 2

1 x m サイズのタイルを使用して n x m の床を敷き詰める方法の数は:2

説明

1×3 のタイル 3 枚をすべて縦方向に並べる方法と、すべて横方向に並べる方法があり、合計 2 通りとなります。

考え方(アプローチ)

このアプローチでは、n の値に応じて場合分けを行います。

  • n が m より小さい場合(または n が 1 の場合):タイルの置き方は 1 通りのみです。
  • n が m と等しい場合:すべて縦に並べる方法とすべて横に並べる方法の 2 通りがあります。
  • n が m より大きい場合:それまでの計算結果を利用して、ways[n] = ways[n−1] + ways[n−m] として求めます。

アルゴリズムの手順

  • 床とタイルの寸法として整数 n と m を受け取ります。
  • 関数 ways_tile_floor(int N, int M) は寸法を受け取り、1×m サイズのタイルで n×m の床を敷き詰める方法の数を返します。
  • 長さ N+1 の配列 arr[ ] を用意し、インデックス i(現在の N の値)における配置方法の数を格納します。
  • arr[0] は 0 で初期化します。
  • for ループで i=1 から i=N まで配列を走査します。各 arr[i] について、i > M の場合は前の値を使って arr[i] = arr[i − 1] + arr[i − M] と計算します。
  • i = 1 または i < M の場合は、arr[i] を 1 に設定します。
  • i = M の場合は、arr[i] = 2 とします。
  • ループ終了後、arr[N] にタイルの配置方法の総数が格納されています。
  • arr[N] を結果として返します。

C++ 実装例

#include <bits/stdc++.h>
using namespace std;
int ways_tile_floor(int N, int M){
    int arr[N + 1];
    arr[0] = 0;
    for (int i = 1; i <= N; i++){
       if (i > M){
          arr[i] = arr[i − 1] + arr[i − M];
       }
       else if (i < M || i == 1){
          arr[i] = 1;
       } else {
          arr[i] = 2;
       }
   }
   return arr[N];
}
int main(){
   int n = 3, m = 2;
   cout<<"1 x m サイズのタイルを使用して n x m の床を敷き詰める方法の数:"<<ways_tile_floor(n, m);
   return 0;
}

実行結果

上記のコードを実行すると、次の出力が得られます。

1 x m サイズのタイルを使用して n x m の床を敷き詰める方法の数:3
  1. C++とOpenCVで動画の総フレーム数をカウント・取得する方法

    はじめにこの記事では、OpenCVを使って動画の総フレーム数を求める方法を解説します。OpenCVを利用すれば、動画の総フレーム数を数えて表示するのは非常に簡単です。ただし、一点だけ注意が必要です。リアルタイム映像(Webカメラの映像など)のフレーム数は数えることができません。リアルタイム映像には決まったフレーム数が存在しないためです。以下のプログラムでは、動画ファイルの総フレーム数をカウントし、コンソール画面に表示します。サンプルコード#include<opencv2/opencv.hpp> #include<iostream> using namespace std

  2. C++で指定サイズの長方形内に作成できる菱形の個数を数える方法

    問題の概要 高さ×幅の寸法をもつ長方形が与えられます。この長方形は2次元座標系上に配置されており、左下の頂点が原点 (0,0) に位置します。今回の目的は、次のすべての条件を満たす菱形がこの長方形内にいくつ作れるかを数えることです。 菱形の面積が0より大きいこと。 菱形の対角線がx軸およびy軸に平行であること。 菱形のすべての頂点が整数座標を持つこと。 入出力例 入力:縦=3、横=3 出力:指定サイズの長方形内に作れる菱形の個数:4 説明:下の図は縦3×横3の長方形です。面積が0より大きく、対角線が両軸に平行で、頂点が整数座標である菱形が4つ存在します。 1つ目 [ (1,0), (2,1