迷路バックトラック迷路溶液中のラット

ラビリンスは、[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を返します。
}

  

 

おすすめ

転載: www.cnblogs.com/277223178dudu/p/11403721.html