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

複数のステップまたはジャンプが許可された迷路のC++ラット


n*nグリッド迷路が与えられます。私たちのネズミはグリッドの左上隅にいます。これで、ラットは下または前にのみ移動できます。このバリエーションでは、ブロックの値がゼロ以外の場合に限り、ラットは複数のジャンプを行うことができます。ラットが現在のセルから取ることができる最大のジャンプは、セルに存在する数です。ここで、ラットがグリッドの右下隅に到達できるかどうかを確認する必要があります。たとえば、-

Input : { { {1, 1, 1, 1},
{2, 0, 0, 2},
{3, 1, 0, 0},
{0, 0, 0, 1}
},
Output : { {1, 1, 1, 1},
{0, 0, 0, 1},
{0, 0, 0, 0},
{0, 0, 0, 1}
}

Input : {
{2, 1, 0, 0},
{2, 0, 0, 1},
{0, 1, 0, 1},
{0, 0, 0, 1}
}
Output: Path doesn't exist

解決策を見つけるためのアプローチ

このアプローチでは、バックトラッキングを使用して、ラットが現在取ることができるすべてのパスを追跡します。ラットがいずれかのパスから目的地に到達した場合、そのパスに対してtrueを返し、パスを出力します。それ以外の場合は、パスが存在しないことを印刷します。

 
#include <bits/stdc++.h>
using namespace std;
#define N 4 // size of our grid
bool solveMaze(int maze[N][N], int x, int y, // recursive function for finding the path
    int sol[N][N]){
        if (x == N - 1 && y == N - 1) { // if we reached our goal we return true and mark our goal as 1
            sol[x][y] = 1;
            return true;
    }
    if (x >= 0 && y >= 0 && x < N && y < N && maze[x][y]) {
        sol[x][y] = 1; // we include this index as a path
        for (int i = 1; i <= maze[x][y] && i < N; i++) { // as maze[x][y] denotes the number of jumps you can take                                             //so we check for every jump in every direction
            if (solveMaze(maze, x + i, y, sol) == true) // jumping right
               return true;
            if (solveMaze(maze, x, y + i, sol) == true) // jumping downward
               return true;
        }
        sol[x][y] = 0; // if none are true then the path doesn't exist
                   //or the path doesn't contain current cell in it
        return false;
    }
    return false;
}
int main(){
    int maze[N][N] = { { 2, 1, 0, 0 }, { 3, 0, 0, 1 },{ 0, 1, 0, 1 },
                   { 0, 0, 0, 1 } };
    int sol[N][N];
    memset(sol, 0, sizeof(sol));
    if(solveMaze(maze, 0, 0, sol)){
        for(int i = 0; i < N; i++){
            for(int j = 0; j < N; j++)
                cout << sol[i][j] << " ";
            cout << "\n";
        }
    }
    else
        cout << "Path doesn't exist\n";
    return 0;
}

出力

1 0 0 0
1 0 0 1
0 0 0 1
0 0 0 1

上記のコードの説明

上記のアプローチでは、現在のセルから作成できるすべてのパスをチェックし、それをチェックしながら、パスを1つとしてマークします。パスが行き止まりに達すると、その行き止まりが目的地であるかどうかを確認します。これが目的地でない場合は、バックトラックします。バックトラックすると、このパスが無効であるため、セルに0のマークが付けられます。これが、コードの進行方法です。

結論

このチュートリアルでは、複数のステップまたはジャンプが許可された迷路でラットを解きます。また、この問題のC ++プログラムと、この問題を解決するための完全なアプローチ(通常)についても学びました。同じプログラムを、C、java、python、その他の言語などの他の言語で作成できます。このチュートリアルがお役に立てば幸いです。


  1. C++でゲームIVをジャンプする

    arrという整数の配列があるとします。最初はインデックス0にいます。1つのステップで、インデックスiからi + xにジャンプできます。ここで、i +x =0。jここで:arr[i]とarr[j]は同じであり、iとjは同じではありません。ここで、nは配列のサイズです。配列の最後のインデックスに到達するための最小ステップ数を見つける必要があります。 したがって、入力が次のような場合、 その場合、出力は3になります。インデックス0から4、3から9への3つのジャンプが必要です。 これを解決するには、次の手順に従います- 1つのマップを定義するm n:=arrのサイズ 初期

  2. C++でゲームVをジャンプする

    arrと呼ばれる整数の配列と整数dがあるとします。 1つのステップで、インデックスiから-にジャンプできます。 i + xここで、i +x