luoguP1379- 8つのデジタル問題(BI BFS)

トピックリンクします。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 ] = { - 11、 - 33 }。
キュー <ノード> 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 "14 }。
    MP1 [S]= 1、MP2 [ " 123804765 " ] = 1 
    q1.push(BG)、q2.push(編); 
    BFS(); 
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/FrankChen831X/p/11203514.html