ソリューションDFS迷路(出力パス)hdoj1010

プッシュ(P1)。






		}
		一方、(temp.empty()!)
		すべての開始から終了配列であるTEMP {//出力、内部パス
			ポイントP1 = temp.top(); 
			; temp.pop()
			path.push(P1); / /バックパス経路内の、バック、バックトレースため!!! 
			COUT << "(" << P1.x << "" << << p1.y ")" << ENDL; 
		} 
		リターン; 
	} 

	IF(X <0 || X> = Y N- || <|| 0 Y> = m)の
        リターン; 

    (I = 0 int型、Iは<4; Iは++)のため// 4つの方向から検出
	{ 
		int型X = NX DIR + [I] [0]は、
		方向を選択し、さらに新たな前座標:// NX、NY; int型NY + Yは、DIR [I] [1] = 
		(0 <= NX && NX場合 <N && 0 <= && NY NY <M &&迷路[NX] [NY] == 0 && VIS [NX] [NY] == 0)
		{//条件:NX、NYが範囲外ではない、[NX] [NY]を迷路 = 0点は障害物が取ることができるされていない、[NX] [nyは】VIS 0 = (NXを説明、NY)がアクセスされない、アクセス

			VIS [NX] [NY] = 1; // セット訪問
			PX = NX; 
			Pyと= NY。 
			path.push(P-)を; //現在の点プッシュせ

			DFS(NX、NY); //さらにプローブ
 
			VIS [NX] [NY] = // 0 バック
			path.pop(); //それがあるため、バックトラックので、現在のポイントがリターンポイントに属し、必要スタック
		} 
	} 

} 

int型のmain()
{ 
    COUNT = 0; 
    freopenは( "in.txt"、 "R&LT"、STDIN); 

    PX = 0; 
    のPy = 0; 
    path.push(P); 

    CIN >> N-M ; 
    のための(INT I = 0、I <N - 、I ++)
    { 
        ため(INT J = 0; J <M、J ++)
        { 
            VIS [I] [J] = 0; 
            CIN >>迷路[I]、[J]。
        } 
    } 
    DFS(0,0); 
    戻り0; 

}

一般的なタスク:1は、第2の出力可能なパスを実現可能に決定しました。

In.txtは迷路のようにしています。

5 6
0 1 0 0 0 1
0 0 0 1 0 0
1 0 1 0 0 1
1 0 0 1 0 1
1 1 0 0 0 0

要約:

1.スタックの基本的な使い方は次のように:

ヘッダファイルします。#include <スタック>

定義されたスタック:スタック<ポイント>パス。

スタック要素点P:path.push(X)。

スタックの先頭の要素:path.pop();

先頭の要素を取得します:点p1 = path.topを();

空のスタックを分析:path.empty();

 

2.二つの理由2つのスタックを使用するスタックトレースパスがあります。

この再帰の終了後、スタックが空の場合でも、バックトラック、バック方法がないため、出力要素はまた、スタックパスに戻される必要がある後にまず、最後に到達する時間は、すべての要素は、出力する必要がその一時的なスタック温度の必要性、そのため、すべてのスタックの要素、そしてバックパスに。

第二に、スタックの底にスタックからのパスので、スタックに逆パスは、スタック温度の一時的なものを必要とし、スタックから正しい順序で一時パス、これはから宛先への原点です。

 

必要性の剪定ようにします。

1.パリティ剪定。T秒は、一定の距離とマンハッタンのパリティを持つ任意の長さのパスを述べに行ってきました。

2.少し剪定。ポイントは、<= Tを行くことができる場合は、パスが存在してはいけません。

おすすめ

転載: www.cnblogs.com/blackprience/p/11130481.html