迷路の中のラットのためのCプログラム-バックトラッキング-2?
迷路の中のネズミも、バックトラックを利用する一般的な問題の1つです。私
迷路は、一部のセルがブロックされている2Dマトリックスです。セルの1つはソースセルであり、そこから開始する必要があります。そしてもう1つは、私たちが到達しなければならない目的地です。ブロックされたセルに移動せずに、送信元から宛先までのパスを見つける必要があります。未解決の迷路の写真を以下に示します。
そしてこれがその解決策です。
このパズルを解くために、最初にソースセルから始めて、パスがブロックされていない方向に移動します。道をたどると目的地にたどり着くことができれば、パズルは解かれます。そうでなければ、私たちは戻ってきて、たどった道の方向を変えます。コードにも同じロジックを実装します。
Input: maze[][] = { {0,1,0,1,1}, {0,0,0,0,0}, {1,0,1,0,1}, {0,0,1,0,0}, {1,0,0,1,0}} Output: 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1
説明
まず、迷路を表す行列を作成します。行列の要素は0または1になります。1はブロックされたセルを表し、0は移動できるセルを表します。上に示した迷路のマトリックスは次のとおりです。
0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0
次に、ソリューションを格納するために、同じ次元の行列をもう1つ作成します。その要素も0または1になります。1はパス内のセルを表し、残りのセルは0になります。ソリューションを表す行列は次のとおりです。
1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1
これで、行列ができました。次に、ソースセルから宛先セルへのパスを見つけます。実行する手順は次のとおりです。
-
現在のセルを確認します。宛先セルの場合、パズルは解かれます。
-
そうでない場合は、下に移動して、下のセルに移動できるかどうかを確認します(セルに移動するには、セルが空で、パスにまだ存在していない必要があります)。
-
そこに移動できれば、次の下向きのセルへのパスを続行します。
-
そうでない場合は、右側のセルに移動しようとします。そして、それがブロックされたり、奪われたりした場合は、上に移動します。
-
同様に、上に移動できない場合は、単に左のセルに移動します。
-
4つの移動(下、右、上、または左)のいずれも不可能な場合は、単に戻って現在のパスを変更します(バックトラック)。
したがって、要約すると、現在のセルから他のセル(下、右、上、左)に移動しようとします。移動できない場合は、戻って別のセルへのパスの方向を変更します。
printsolution→この関数は、ソリューションマトリックスを印刷するだけです。
Solvemaze→これは、バックトラッキングアルゴリズムを実装している実際の関数です。まず、(r ==SIZE-1)および(c ==SIZE-1)の場合、セルが宛先セルであるかどうかを確認します。それが宛先セルである場合、私たちのパズルはすでに解決されています。そうでない場合は、移動するのが有効なセルであるかどうかを確認しています。有効なセルはマトリックス内にある必要があります。つまり、インデックスは0からSIZE-1の間でなければなりません。r> =0 &&c> =0 &&r
例
#include <iostream> using namespace std; #define SIZE 5 //the maze problem int maze[SIZE][SIZE] = { {0,1,0,1,1}, {0,0,0,0,0}, {1,0,1,0,1}, {0,0,1,0,0}, {1,0,0,1,0} }; //matrix to store the solution int solution[SIZE][SIZE]; //function to print the solution matrix void printsolution() { int i,j; for(i=0;i<SIZE;i++) { for(j=0;j<SIZE;j++) { printf("%d\t",solution[i][j]); } printf("\n\n"); } } //function to solve the maze //using backtracking int solvemaze(int r, int c) { //if destination is reached, maze is solved //destination is the last cell(maze[SIZE-1][SIZE-1]) if((r==SIZE-1) && (c==SIZE-1) { solution[r][c] = 1; return 1; } //checking if we can visit in this cell or not //the indices of the cell must be in (0,SIZE-1) //and solution[r][c] == 0 is making sure that the cell is not already visited //maze[r][c] == 0 is making sure that the cell is not blocked if(r>=0 && c>=0 && r<SIZE && c<SIZE && solution[r][c] == 0 && maze[r][c] == 0){ //if safe to visit then visit the cell solution[r][c] = 1; //going down if(solvemaze(r+1, c)) return 1; //going right if(solvemaze(r, c+1)) return 1; //going up if(solvemaze(r-1, c)) return 1; //going left if(solvemaze(r, c-1)) return 1; //backtracking solution[r][c] = 0; return 0; } return 0; } int main() { //making all elements of the solution matrix 0 int i,j; for(i=0; i<SIZE; i++) { for(j=0; j<SIZE; j++) { solution[i][j] = 0; } } if (solvemaze(0,0)) printsolution(); else printf("No solution\n"); return 0; }
-
cos(x)級数の合計のCプログラム
xとnの値が与えられます。ここで、xはcosの角度、nはcos(x)級数の項の数です。 Cos(x)の場合 Cos(x)は、x角度の値を計算するために使用される三角関数です。 式 $$ \ cos(x)=\ displaystyle \ sum \ Limits_ {k =0} ^ \ infty \ frac {(-1)^ {k}} {(2k!)} x ^ {2k} $$ Cos(x)シリーズの場合 Cos(x)=1 –(x * 2/2!)+(x * 4/4!)–(x * 6/6!)+(x * 8/8!)…… 例 Input-: x = 10, n = 3 Output-:
-
Cでのクリスマスツリーのプログラム
ここで、1つの興味深い問題が発生します。この問題では、クリスマスツリーをランダムに印刷する方法を見ていきます。そのため、ツリーはクリスマスツリーのライトのようにちらつきます。 クリスマスツリーを印刷するために、さまざまなサイズのピラミッドを上下に並べて印刷します。装飾的な葉の場合、ランダムな文字が指定された文字のリストから印刷されます。高さとランダム性は調整可能です。 ここでは、ツリーを生成した後、画面全体がクリアされてから再度生成されます。そのため、これはちらつきツリーのように見えます。 例 #include <stdio.h> #include <stdlib.h&g