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

C++でm×n行列の左上から右下への全経路数を求める方法

はじめに

このチュートリアルでは、m×n行列(グリッド)の左上から右下まで移動する際の、取り得るすべての経路の総数を求めるC++プログラムについて解説します。

m×nの行列が与えられたとき、左上のセルから右下のセルへ到達するすべての移動経路を数えることが課題です。なお、移動は「右」または「下」のいずれかの方向のみ許されるものとします。

アルゴリズムの考え方

この問題は再帰を使ってシンプルに解くことができます。セル(m, n)に到達する経路の数は、「上隣のセル(m-1, n)に到達する経路の数」と「左隣のセル(m, n-1)に到達する経路の数」の合計になります。最上行または最左列にあるセルには、それぞれ1通りのみで到達できるため、その場合は1を返します。

コード例

#include <iostream>
using namespace std;
// 可能な経路の数を返す関数
int count_paths(int m, int n){
   if (m == 1 || n == 1)
      return 1;
   return count_paths(m - 1, n) + count_paths(m, n - 1);
}
int main(){
   cout << count_paths(3, 3);
   return 0;
}

出力結果

6

解説

上記のコードでは、count_paths(3, 3) を呼び出しています。3×3の行列の場合、左上から右下までの経路は全部で6通り存在します。この再帰的なアプローチは直感的で理解しやすい反面、同じ計算を何度も繰り返すため非効率になることがあります。大きな行列を扱う場合は、動的計画法(DP)や組み合わせの公式 C(m+n-2, m-1) を利用することで、計算量を大幅に削減できます。

  1. C++で二分木のすべての葉ノードを右から左の順に出力する方法

    問題概要この記事では、二分木(binary tree)が与えられたとき、そのすべての葉ノード(リーフノード)を右から左の順で出力する方法を解説します。まず、具体例を使って問題を確認しましょう。入力例出力例7 4 1この問題を解くには、二分木を走査(トラバース)する必要があります。走査のアプローチは主に次の2つがあります。方法1:前順走査(Preorder Traversal)+ 再帰前順走査は再帰を用いた手法で、通常は「根 → 左部分木 → 右部分木」の順にノードを訪問します。ただし今回は右から左へ出力する必要があるため、再帰呼び出しの順序を「右部分木 → 左部分木」にするのがポイントです。葉

  2. C++で始点から終点までのすべての経路を出力する方法|深さ優先探索(DFS)による実装

    この記事では、有向グラフが与えられたときに、始点(ソース)から終点(デスティネーション)までのすべての経路を出力する問題を、C++で解く方法を解説します。有向グラフとは?有向グラフとは、各辺に向きが定められており、頂点Aから頂点Bへと一方向に進むことができるグラフのことです。逆向き(BからA)には、対応する逆向きの辺が存在しない限り移動できません。問題の例具体例を使って問題を理解しましょう。下図のようなグラフを考えます。始点を「K」、終点を「P」とした場合の出力は次のようになります。出力:K -> T -> Y -> A -> P K -> T -> Y -