トピックリンクします。https://www.luogu.org/problemnew/show/P1379
質問の意味:ステップの与えられた8つのデジタルエンド状態最小数取得しようとしている、8つのデジタル文字列で表される「123804765」を
考える:この問題は、2つのキュー、その状態のステップ数を記録するための2つのマップで終了検索、先頭から、それぞれ、最適化するために、双方向のBFSを使用することは非常に簡単です。それが必要レイド文初期状態と同じ状態の終わりであることに留意されたいです。
ACコード:
書式#include <cstdioを> する#include <キュー> の#include <アルゴリズム> 書式#include < 文字列 > の#include <マップ> 書式#include <iostreamの> 使用して 名前空間はstd; 構造体ノード{ ストリングS。 int型のステップ、ワット。 }。 INT行く[ 4 ] = { - 1、1、 - 3、3 }。 キュー <ノード> Q1、Q2; マップ < 文字列、整数 > MP1、MP2; BOOL ISOK(INT W、int型K){ int型、X = W + 行く[K]。 もし(X < 0 || X> 8)を返す 偽。 もし(%W 3 == 0 && Kの== 0)を返す 偽。 もし(%W 3 == 2 && Kの== 1)を返す 偽。 返す 真; } ボイドBFS(){ ながら(!q1.empty()&&!q2.empty()){ ノードnow1 =q1.front(); q1.pop()。 文字列 S1 = now1.s。 int型 STEP1 = now1.step、W1 = now1.w。 以下のために(int型私= 0 ;私は< 4 ; ++ I){ 場合(ISOK(W1、I)!)続けます。 int型 WW = W1 +行く[i]は、ST = STEP1 + 1 ; 文字列 SS = S1; スワップ(SS [W1]、SS [WW])。 もし(MP1 [SS])続けます。 もし(MP2 [SS]){ のprintf(" %d個の\ n "、STEP1 + MP2 [SS] -1 ); 返します。 } MP1 [SS] = ST。 ノードTMP = {SS、ST、WW}。 q1.push(TMP)。 } ノードnow2 = q2.front(); q2.pop()。 文字列 s2を= now2.s。 int型 STEP2 = now2.step、W2 = now2.w。 以下のために(int型私= 0 ;私は< 4 ; ++ I){ 場合(ISOK(W2、I)!)続けます。 int型 WW = W2 +行く[i]は、STは= STEP2 + 1; 文字列 SS = S2。 スワップ(SS [W2]、SS [WW])。 もし(MP2 [SS])続けます。 もし(MP1 [SS]){ のprintf(" %Dを\ n "、STEP2 + MP1 [SS] - 1 )。 返します。 } MP2 [SS] = ST。 ノードTMP = {SS、ST、WW}。 q2.push(TMP)。 } } } int型のmain(){ ストリングS。 cinを >> 秒; もし(S == " 123804765 " ){ のprintf(" 0 \ n " ); リターン 0 ; } INT W。 以下のために(int型 i = 0 ; iはs.lengthを()<; ++ I) もし(S [I] == ' 0 ' ){ W = I。破ります; } ノードBG = {S、1 、W}。 ノードED = { " 123804765 "、1、4 }。 MP1 [S]= 1、MP2 [ " 123804765 " ] = 1 。 q1.push(BG)、q2.push(編); BFS(); リターン 0 ; }