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

C++でマトリックスの最後に到達するために必要な最小ステップを見つける


正の整数を持つ2D行列があるとします。マトリックスの最後(右下のセル)に移動するために必要な最小ステップを見つける必要があります。セル(i、j)にいる場合は、セル(i、j + mat [i、j)に移動できます。 ])または(i + mat [i、j]、j)、境界を越えることはできません。したがって、行列が-

のような場合
2 1 2
1 1 1
1 1 1

出力は2になります。パスは(0、0)→(0、2)→(2、2)

になります。

ここでは、動的計画法を使用してこれを解決します。セル(i、j)にいるとすると、(n-1、n-1)セルに到達したいとします。以下のような漸化式を使用できます-

DP [i、j] =1 +min⁡(DP [i + arr [i、j]、j]、DP [i、j + arr [i、j]])

#include<iostream>
#define N 3
using namespace std;
int table[N][N];
bool temp_val[N][N];
int countSteps(int i, int j, int arr[][N]) {
   if (i == N - 1 and j == N - 1)
      return 0;
   if (i > N - 1 || j > N - 1)
      return INT_MAX;
   if (temp_val[i][j])
      return table[i][j];
   temp_val[i][j] = true;
   table[i][j] = 1 + min(countSteps(i + arr[i][j], j, arr), countSteps(i, j + arr[i][j], arr));
   return table[i][j];
}
int main() {
   int arr[N][N] = { { 2, 1, 2 }, { 1, 1, 1 }, { 1, 1, 1 } };
   int ans = countSteps(0, 0, arr);
   if (ans >= INT_MAX)
      cout << -1;
   else
      cout <<"Number of steps: "<< ans;
}

出力

Number of steps: 2

  1. C++で対戦相手を捕まえるために必要な最小ステップ数を見つけるためのプログラム

    [u、v]の形式のツリーエッジのリストがあると仮定します。これは、uとvの間に無向エッジがあることを示します。また、xとyの2つの値があります。ノードxにいて、対戦相手がノードyにいる場合。最初のラウンドでは移動し、次のラウンドでは対戦相手が移動します。対戦相手は、ラウンドで移動しないことを選択できます。対戦相手を捕まえるのに必要な最小ラウンド数を見つける必要があります。 したがって、入力がedges =[[0、1]、[0、2]、[1、3]、[1、4]]、x =0、y =3のような場合、出力は3になります。最初と同じように、ノード0から1に移動します。その後、対戦相手は現在のノード3に留まり

  2. C#を使用して配列の最後に到達するために必要なジャンプの最小数を見つける方法は?

    最初の要素から始めて、最初の要素から到達可能なすべての要素を繰り返し呼び出すことができます。最初から最後まで到達するための最小ジャンプ数は、最初から到達可能な要素から最後まで到達するために必要な最小ジャンプ数を使用して計算できます。 配列=={1、3、6、3、2、3、6、8、9、5}; 必要なステップ数は4です 例 using System; namespace ConsoleApplication{    public class Arrays{       public int MinJumps(int[] arr, int l, i