DFSとBFS
我々は、一般のDFSとBFSの解決について話す前に。(私はBFSません感じます)
1.DFS
その名のように、DFS(深さ優先アルゴリズム)、DFSは見たことがない背中の最も深い種類に来ていない、かなりの深さです。
深さ優先探索は、すべての場合にすべてのフルパス横断する検索方法の列挙です。
使用再帰は深さ優先探索を実現することができます。
再帰を使用している場合、システムはその自然の中でDFSを実装するために再帰を使用して、それぞれの層に再帰の状態を保存するために、システムスタックと呼ばれるものを呼び出しますが、それはスタックまだです。
テンプレート次DFS:
空 DFS(){ // パラメータがの状態を示している IFは(終了状態に到達した){ ... //は、質問の意味追加 返す; } のIF (範囲外または法的な状態ではありません) リターン; IF(特殊な状態)// せん断分岐 リターン; 用(拡張モード){ IF (拡張状態正当なやり方が達成){ 操作を変更; //は、質問の意味を追加し たマーク、 DFS(); (マークの減少); // 質問の意味が削減マークされた場合に //をアドオン(著しい減少)がバックトラックされた場合 } } }
次に問題に今日のソリューションを開始
https://vjudge.net/problem/POJ-3984からタイトル
迷路
1.説明タイトル:2
二次元配列の定義:
INT迷路[5] [5] = {
0、1、0、0、0、
0、1、0、1、0、
0、0、0、0、0、
0、1、1、1、0、
0、0、0、1、0、
}。
それは1壁、右上隅を下げるために、左から最短のルートを見つけるようにプログラム要求、横に行くことができない、唯一の横に行くことができ、または垂直に移動するように、移動するための0方法を示したラビリンスを表します
入力
迷路を示す5×5の2次元配列。データは独自のソリューションを持っていることを確認してください。
出力
右下の最短経路に左、サンプルに示すようにフォーマット。
サンプル入力
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
サンプル出力
(0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (2,4) (3,4) (4,4)
被験者の2解析
れますそれはあなたがマップ上の最短経路を見つけることができるように、あなたのマップを与えるために、あるタイトルサーチの基本的な質問に属している。
探索問題では、我々は言及DFS(深さ優先アルゴリズム)以上使用することができ、そこにあります種BFS(幅優先アルゴリズム)です。どちらの方法でも、することができます。
しかし、この質問は、我々はパスを格納するためのキュー構造を使用することにより、BFSを選ぶのでそう、使用することは容易ではない、DFS、迷路のトラバーサルのオーダーです。
ここでは、コードは次のようになります。
する#include <stdio.hの> 構造体ノード{ int型 X; // X座標 intを Y; // Y座標 INTプリ; // 出発点まで }; INT予約[ 6 ] [ 6 ]; //は、アクセスポイントかどうかを記録しますスルー INT [マップ。6 ] [ 6。 ;] // 記録図 の構造体ノードキュー[ 20である ]; // キューストレージ・経路 ボイドプリント(構造体ノードA)// 実現される機能の出力パス { IF(a.pre == - 1 ) { のprintf(" (%d個、%d)は\ n " 、AX、AY)。 リターン; } 他 { 印刷(キュー[a.pre])。 printf(" (%d個、%d)は\ n " 、AX、AY)。 } } int型のmain() { int型I、J、K、M、N、X、Y。 int型のヘッド、テール; 以下のための(iは= 0 ; I < 5 ; I ++ ) { ため(J = 0 ; J < 5 ; J ++ ) { scanf関数("D%"&マップ[I] [J]); } } ヘッド = 0 ; 尾 = 0 、 キュー[尾] .X = 0 、 キュー[尾] .Y = 0 、 キュー[尾] .PRE = - 。1 ; 予約[ 0 ] [ 0 ] = 1 ; 尾 ++ ; 一方(ヘッド<テール)// キューが空に出ている場合、検索が実行可能パスが記述見つからない { INT次へ[ 4。 [] 2 ] = {{ 0、1 }、{ 0 - 1 }、{ 1、0 }、{ - 1、0 }}; //は四方を定義 int型 =のフラグ0 ; のために(私は= 0 ; I < 4。 ; I ++) / / 周りの現在の位置から探索する { int型 nextx =キュー[ヘッド]次に.X + [I] [ 0 ;] INT nexty =キュー[ヘッド]次に.Y + [I] [ 1 ]; // モバイル IF( nextx < 0 || nextx> 5 || nexty < 0 || nexty>5)// バウンスの境界を越えて { 続行; } IF(書籍[nextx] [nexty] == 0 &&マップ[nextx] [nexty] == 0)// ノードがアクセスしない場合にのみ実行可能な点チーム { ブック[nextx] [nexty] = 1 ; キュー[尾] .X = nextx; キュー[尾] .Y = nexty; キュー[尾] .PRE = ヘッドと テール ++ ; } IF(nextx == 。4 nexty == && 4)// サイクルの終わりのうち、疑いを宛先に到達 { でフラグ = 1。; ブレーク; } } IF(のフラグ)// 到着呼び出す関数出力パス { 印刷(キュー[テイル - 1 )]; BREAK ; } ヘッド ++; // デキュー } の戻り 0 ; }
主な関心は、他の人は大丈夫です、キューを使用することです