ラビリンスは、[N-1] [0]、対象ブロックが右下のブロック、即ち迷路[0]のソースブロックは、左上ブロック、即ち迷路である、N *のブロックNバイナリ行列として与えられます。 N-1]。ソースからのマウスの出発は、目的地に到着しなければなりません。マウスは2つのだけの方向に移動:前下がり。
迷路におけるマトリクス、ブロック0のデッドエンド、ブロック1は、ソースから宛先へのパスを表すために使用されてもよいです。これは典型的な迷路問題の簡易版であることに注意してください。例えば、マウスのより複雑なバージョンは、4つの方向に移動可能であり、及びより複雑なバージョンの限られた数の移動することができます。
以下は、迷路の一例です。
バックトラックの三部作をバックトラック:
1生データを初期化し、開始点
2法的に戻らない場合には、再帰的に答えを探しを続けた場合、次のステップは、法的な正当であるかを決定するために
あなたが見つけるまで3再帰的に答えが真の値を返します。
ここではちょうど限り解決策が見つかったとして、すぐに戻すことができ、その上に解決策を見つける必要があります。
/ * A迷路は、ソースブロックが上位であるブロックのN * Nのバイナリ行列で与えられる [0] [0]および宛先ブロックが下右端の最も左側のブロック、すなわち、迷路 ブロック、すなわち、迷路[N-1] [N- 1]。ラットは、ソースから始まり、目的地に到達するために持っています。 ラットは二つの方向にのみ移動することができます:フォワードおよびダウン。迷路マトリックス中に、 0ブロックが行き止まりであり、1ブロックがパスに使用することができる手段 元から宛先まで。 * / 書式#include <iostreamの> に#defineサイズ4 名前空間stdを使用。 INT solveMaze(INT currposrow、INT currposcol、INT迷路[サイズ] [サイズ]、INT SOLN [サイズ] [サイズ]) { IF((currposrow ==サイズ- 1)&&(currposcol ==サイズ- 1)) { SOLN [currposrow] [currposcol] = 1。 (I 0 = int型、私はサイズを<; ++ i)のために { (INT J = 0; J <サイズ; ++ j)のための { COUT << SOLN [I] [J]。 } COUT << ENDL。 } 1を返します。 } 他 { SOLN [currposrow] [currposcol] = 1。 collumnで一歩先を移動させることにより、溶液が存在する場合// ((currposcolが<サイズの場合- 1)&&迷路[currposrow] [currposcol + 1] == 1 && solveMaze(currposrow、currposcol + 1、迷路、SOLN) ) { 1を返します。 } //行の一歩先を移動させることにより、溶液が存在する場合 ((currposrow <サイズ場合- 1)&&迷路[currposrow + 1] [currposcol] == 1 && solveMaze(currposrow + 1、currposcol、迷路、 } //バックトラック部 [currposrow] [currposcol] SOLN = 0; 0を返します。 } } int型のmain(int型ARGC、チャーCONST * ARGV []) { int型迷路[サイズ] [サイズ] = { {1、0、1、0}、 {1、0、1、1}、 {1,0 、0、1}、 {1、1、1、1} }。 INT SOLN [サイズ] [サイズ]。 以下のために(; iはサイズ<; I = 0 int型++ I) { ための(int型J = 0; J <サイズ; ++ J) { SOLN [I] [J] = 0; } } int型currposrow = 0。 int型currposcol = 0; solveMaze(currposrow、currposcol、迷路、SOLN)。 システム(「一時停止」)。 0を返します。 }