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

迷路の中のラットのためのCプログラム-バックトラッキング-2?


迷路の中のネズミも、バックトラックを利用する一般的な問題の1つです。私

迷路は、一部のセルがブロックされている2Dマトリックスです。セルの1つはソースセルであり、そこから開始する必要があります。そしてもう1つは、私たちが到達しなければならない目的地です。ブロックされたセルに移動せずに、送信元から宛先までのパスを見つける必要があります。未解決の迷路の写真を以下に示します。

迷路の中のラットのためのCプログラム-バックトラッキング-2?

そしてこれがその解決策です。

迷路の中のラットのためのCプログラム-バックトラッキング-2?

このパズルを解くために、最初にソースセルから始めて、パスがブロックされていない方向に移動します。道をたどると目的地にたどり着くことができれば、パズルは解かれます。そうでなければ、私たちは戻ってきて、たどった道の方向を変えます。コードにも同じロジックを実装します。

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;
}

  1. 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-:

  2. Cでのクリスマスツリーのプログラム

    ここで、1つの興味深い問題が発生します。この問題では、クリスマスツリーをランダムに印刷する方法を見ていきます。そのため、ツリーはクリスマスツリーのライトのようにちらつきます。 クリスマスツリーを印刷するために、さまざまなサイズのピラミッドを上下に並べて印刷します。装飾的な葉の場合、ランダムな文字が指定された文字のリストから印刷されます。高さとランダム性は調整可能です。 ここでは、ツリーを生成した後、画面全体がクリアされてから再度生成されます。そのため、これはちらつきツリーのように見えます。 例 #include <stdio.h> #include <stdlib.h&g