説明文
初期状態のステップ数が1でも、笑
入力:最初の3 * 3行列は元の状態で、2番目の3 * 3行列はターゲット状態です。
出力:移動に使用される最小ステップ数
入力
2 8 3
1 6 4
7 0 5
1 2 3
8 0 4
7 6 5
出力
6
参照リンク:質問C:[ワイドサーチの開始] 8つのデジタル問題
最終的なACコードは次のとおりです。
#include <ビット/ STDC ++ H.> 使用して 名前空間STD; INT最終[ 3 ] [ 3 ]; INT [DIR 。4 ] [ 2 ] = {{ 0、 - 1 }、{ - 1、0 }、{ 0、1 }、{ 1、0 }}; // 方向の 構造体ノード{ int型の X、Y、STEP、PDIR、M [ 3 ] [ 3 ]; // 現在の行列状態の最後の記録時間PDIR方向M }今、NEX。 ブール裁判官(){ inti、j; for(i = 0 ; i < 3 ; i ++ ){ for(j = 0 ; j < 3 ; j ++)if(nex.M [i] [j]!= final [i] [j])return false ; } return true ; } int BFS(){ int i、t、ti、tj; now.step = 1 ; now.pdir = 8 ; // 方向を初期化する範囲を-2から6にすることはできません。 キュー<ノード> q; q.push(now); while(!q.empty()){ now =q.front(); q.pop(); for(i = 0 ; i < 4 ; i ++ )( if(abs(i-now.pdir)== 2)continue ; //前のバージョンに戻ることを示しますステータス nex.x = now.x + dir [i] [ 0 ]; nex.y = now.y + dir [i] [ 1 ]; if(nex.x < 0 || nex.x> 2 || nex .y < 0 || nex.y> 2)続行 ; // 不合理な場所 nex.pdir = i; // 記録方向 + = now.step nex.step 1。 ; // ステッププラス1。 ためのチタン(Ti = 0 ;のTi < 3。 ;チタン++){ // コピーマトリックス のための(TJ = 0 ; TJ < 3。 ; TJ ++)nex.M [たTi ] [tj] = now.M [ti] [tj]; } // 次の状態への1つのステップを示す t = nex.M [now.x] [now.y]; nex.M [now.x] [ now.y] = nex.M [nex.x] [nex.y]; nex.M [nex.x] [nex.y] = t; if(judge())return nex.step; q.push( nex); } } return- 1 ; //别忘了遍历完、帖不到的状況 } int main(){ int i、j; for(i = 0 ; i < 3 ; i ++ ){ for(j = 0 ; j < 3 ; j ++ ){ scanf(" %d "、&now.M [i] [j]); if(now.M [i] [j] == 0)now.x = i、now.y = j; } } for(i = 0 ; i < 3 ; i ++ ){ for(j = 0 ; j < 3 ; j ++)scanf(" %d "、&final [i] [j]); } printf(" %d \ n " 、BFS()); 0を返し ます。 }
注:タイトルの説明は比較的単純なので、重要な情報は多くありません。たとえば、-1を返す必要がない場合や、入力した0が画像内のスペースを表す場合があります。
概要:書き込むときに、マトリックスで状態を直接変更するため、後で書き込むことはできません。次に、他の人のコードを参照すると、使用された方法は次のとおりであることがわかりました。各ステップで生成された状態は配列に格納されます。ただし、ここで選択した方向が前の状態に戻ることを避けるために、状態が変換される方向を記録する必要があることに注意してください。
この質問を通じて、BFS()アルゴリズムを新たに理解しました。whileループの各反復の間、特定の条件が満たされている限り、回答が見つかるか検索が完了するまで新しい要素がキューに入れられます。ここで、答えを見つけるプロセスは実際には複数の方法で実行されます。つまり、答えが見つかる前に、いくつかの避けられない「冗長操作」があります。私が理解しているのは、どのパスが答えを見つけることができるかわからないので、最初のレイヤーを通過してから2番目のレイヤーに進むということです。DFS()検索は、典型的な「南の壁にぶつからないで、振り返らない」です。