C++で1段・2段・3段のステップを使ってn番目の階段に到達する方法の数を数える
階段の総段数 n が与えられ、人は一度に1段、2段、または3段を飛び越えて次の階に進むことができるとします。このとき、そのような移動によって次の階に到達する方法が何通りあるかを求めるのが目的です。
この問題は再帰的な手法で解くことができます。i 番目の段に到達するためには、(i−1) 番目の段から1段跳ぶか、(i−2) 番目の段から2段跳ぶか、(i−3) 番目の段から3段跳ぶかのいずれかしかない、という点に着目します。
具体例で確認してみましょう。
入力例と出力例
例1
入力
N=3 段
出力
1段・2段・3段のステップを使ってn番目の階段に到達する方法の数:4
解説
合計3段あります スタートから3段跳ぶ:3 1段目から2段跳ぶ:1+2 2段目から1段跳ぶ:2+1 毎回1段ずつ:1+1+1
例2
入力
N=6 段
出力
1段・2段・3段のステップを使ってn番目の階段に到達する方法の数:24
解説
合計6段あります 方法の例:1+1+1+1+1+1、2+1+1+1+1、3+1+1+1、3+1+2、3+2+1、3+3 など。
プログラムで使用するアプローチ
- 整数型の変数 steps を階段の総段数として受け取ります。
- 関数 stairs_step(int steps) は総段数を引数として受け取り、ジャンプを組み合わせて次の階に到達する方法の数を返します。
- 方法の数を格納するため、初期値 count を 0 として用意します。
- 段数が 0 の場合は 1 を返します(何もしないという1通りの到達方法があるとみなす)。
- 段数が 1 の場合は方法は1通りだけです。
- 段数が 2 の場合は2通りです(1+1 または 2)。
- それ以外の場合は、stairs_step(step−3) + stairs_step(step−2) + stairs_step(step−1) として再帰的に計算します。
再帰的な手法による実装
コード例
#include <iostream>
using namespace std;
int stairs_step(int steps){
if(steps == 0){
return 1;
}
else if(steps == 1){
return 1;
}
else if (steps == 2){
return 2;
}
else{
return stairs_step(steps - 3) + stairs_step(steps - 2) + stairs_step(steps - 1);
}
}
int main(){
int steps = 5;
cout<<"1段・2段・3段のステップを使ってn番目の階段に到達する方法の数:"<<stairs_step(steps);
return 0;
}出力
上記のコードを実行すると、以下の出力が得られます。
1段・2段・3段のステップを使ってn番目の階段に到達する方法の数:13
補足:計算量について
この再帰的な実装はシンプルで理解しやすい一方、同じ値を何度も計算するため指数関数的な時間計算量 O(3ⁿ) となります。段数が大きくなると処理が遅くなるため、実際の開発ではメモ化(動的計画法)を組み合わせて O(n) まで高速化するのが一般的です。各段への到達方法の数を配列に保存し、小さい問題から順に埋めていくことで、効率的に答えを求められます。
-
C++とOpenCVで動画の総フレーム数をカウント・取得する方法
はじめにこの記事では、OpenCVを使って動画の総フレーム数を求める方法を解説します。OpenCVを利用すれば、動画の総フレーム数を数えて表示するのは非常に簡単です。ただし、一点だけ注意が必要です。リアルタイム映像(Webカメラの映像など)のフレーム数は数えることができません。リアルタイム映像には決まったフレーム数が存在しないためです。以下のプログラムでは、動画ファイルの総フレーム数をカウントし、コンソール画面に表示します。サンプルコード#include<opencv2/opencv.hpp> #include<iostream> using namespace std
-
C++で1×mサイズのタイルを使ってn×mの床を敷き詰める方法の数を数える
問題概要部屋の床の長さと幅を表す 2 つの整数 n と m が与えられます。この床をサイズ 1×m のタイルで敷き詰める方法が何通りあるかを数えることが目的です。入力例 1n=3 m=2出力例 11 x m サイズのタイルを使用して n x m の床を敷き詰める方法の数は:3説明下図のように、1×2 のタイル 3 枚を並べる方法が 3 通り存在します。入力例 2n=3 m=3出力例 21 x m サイズのタイルを使用して n x m の床を敷き詰める方法の数は:2説明1×3 のタイル 3 枚をすべて縦方向に並べる方法と、すべて横方向に並べる方法があり、合計 2 通りとなります。考え方(アプロー