https://www.acwing.com/problem/content/847/
#include <ビット/ STDC ++ H.> 使用して 名前空間STD; INT BFS(文字列スタート) { 文字列の終わり= " 12345678x " ; キュー < ストリング > Q; unordered_map < 文字列、整数 > D; // 距離アレイ q.push(開始); // の開始に入れ D [スタート] = 0 ; // 0の起点距離に開始点 のint [DXの4 ] = { 0、0、1、 - 1。}、Dyの[ 4。 = {] 1。 、- 1、0、0 }; 一方(q.size()) { オートT = q.front(); q.pop(); int型の距離= D [T]。 IF(T ==端)戻り距離; //は終了場合、Tが終了したか否かを判断 // 状態遷移 INT K = t.find(' X '); //は、第一添字XリターンのX位置を見つける INT K = Xの/ 3、Y =%K 3。 ; // 二次元の3x3マトリクスアレイ添え字を変換する一次元アレイ 以下のために(int型 I = 0 ;私は< 4。 、私は++ ) { int型 A = X + DX [I]、B = Y + Dyが[I]は、// 変更後の座標 IF(A> = 0 && A < 3 && B> = 0 && B < 3。 ) // そうでない場合範囲外 { スワップ(T [K]、T [A * 3 + B]); // 更新交換が回復状態の更新を完了しなければならない後の IF!(d.count(T) ) // 現在のは、それが新しい状態見つけた更新したことが見出されていなかった後にTである場合 、{ D [T] =距離+を1。 ; //。プラス距離1 q.push(T); // キューに押し込む } スワップ(T [K]、T [A * 3 + B]); // 回復状態 } } } リターン - 1 ; } int型(メイン){ ストリングスタート; // 最初に指定した文字列 のための(int型 I = 0 ;私は< 9。 、私は++ ){ チャーC; CIN >> C; スタート + = C; } COUT<< BFS(開始)<< ENDL。 }