幅優先探索のLeetcode(BFS)テーマ別-773スライダパズル(スライディングブロックパズル)

幅優先探索のLeetcode(BFS)テーマ別-773スライダパズル(スライディングブロックパズル)

BFS詳細なエントリ:幅優先探索(BFS)テーマ別-429トラバーサル順序N-ツリー(N進ツリー上位のオーダートラバーサルのLeetcode )。

志を同じくするタイトル:幅優先探索のLeetcode(BFS)-752オープンテーマのダイヤルロック(ロックを開きます)。

志を同じくするトピック2:幅優先探索(BFS)-127トピックワードソリティア(ワードラダー)のLeetcode。


 

プレートは、2×3( board数値5個のレンガ、有する  1~5 発現を、ギャップと  0 表現。

それは、選択の移動として定義される  0 数(垂直および水平)と隣接する交換。

プレート最終とき  board 結果は、ある  [[1,2,3],[4,5,0]] 解決されるのボード。

与えられた初期状態からボード謎ボードを解決しない場合は、モバイル版を返すために最小回数は、謎を解くことができます-1。

例:

入力:ボード= [1,2,3]、 [4,0,5]] 
出力:1つの
説明:0と交換5、ステップ1が終了します
入力:ボード= [[1,2,3]、 [5,4,0]] 
出力:-1 
説明:からボードを完了するための方法はありません
入力:ボード= [4,1,2]、 [5,0,3]] 
出力:5 
説明:
最小パズル板5を移動の最小数を完了するために、
移動経路:
移動しない:[[4,1 、2]、[5,0,3] 
モバイル1:[[4,1,2]、[0,5,3] 
モバイル2:[[0,1,2]、[4,5 、3] 
モバイル3:[[1,0,2]、[4,5,3] 
モバイル4:[[1,2,0]、[4,5,3] 
モバイル5: [1,2,3]、[4,5,0]
入力:ボード= [[3,2,4]、 [1,5,0]] 
出力:14

ヒント:

  • board 上記のように、2×​​3アレイです。
  • board[i][j][0, 1, 2, 3, 4, 5] 配置。

 

0のみとダウンして問題を解決する参照トピックのアイデアに似VIS配列、の彼の使用の周りまで交換することができます。

志を同じくするタイトル:幅優先探索のLeetcode(BFS)-752オープンテーマのダイヤルロック(ロックを開きます)。

志を同じくするトピック2:幅優先探索(BFS)-127トピックワードソリティア(ワードラダー)のLeetcode。

 

ACこの質問コード:

クラスソリューション{
     INT [] DIRXの= {1、-1、0、0 }。
    INT [] DIRY = {0、0、1、-1 }。

    プライベート 静的 クラスPOINT {
         int型X、Y。
        int型のステップ;
        INT [] []ボード。

        POINT(int型のx、int型の Y、INTのステップは、値int [] []基板)を{
             この .X = X。
            この .Y = Y。
            この。ステップ= ステップと
            この .board = ボード。
        }
    }

    公共 INT slidingPuzzle(INT [] []基板){
         int型の M = 2 INT、N = 3 
        設定して <文字列> VIS = 新しい HashSetの<> (); 
        キュー <POINT>キュー= 新しい LinkedListは<> ();
        以下のためにint型 i = 0; iがm <; iは++ ){
             ためのint型 J = 0であり、j <N; J ++ ){
                 場合(ボード[I] [J] == 0 ){ 
                    vis.add(ボード[0] [0] + "" +ボード[0] [1] + "" +ボード[0] [2] + "" +基板[1] [0] + "" +基板[1] [1] + "" +基板[1] [2 ])。
                    queue.offer(新しい POINT(I、J、0 、ボード)); 

                } 
            } 
        } 
        ながら(!queue.isEmpty()){ 
            点TEMP = queue.poll()。
            int型のx = temp.x。
            INT Y = temp.y。
            int型のステップ= temp.step。
            値int [] []地図= temp.boardと、
            もし([1] [0] [0] == 1 &&地図[0] [1] == 2 &&地図[0] [2] == 3 &&マップ[1] [0] == 4 &&マップをマップ1] == 5 &&マップ[1] [2] == 0 ){
                 戻りステップと 
            } 
            のためにint型、iは4 <; I = 0 iは++ ){
                 int型 [] [] cloneMap = 新しい INT [M] [N]。
                int型 A = 0; <M; ++ ){ 
                    System.arraycopyの(マップ[A]、 0、cloneMap [A]、0 、N)
                } 
                INT XX = X + DIRX [I];
                INT YY = Y + DIRY [I]。
                もし(XX> = 0 && YY> = 0 && XX <M && YY < N){ 
                    cloneMap [X] [Y] = cloneMap [XX] [YY]。
                    cloneMap [XX] [YY] = 0 ; 
                    文字列str = cloneMap [0] [0] + "" + cloneMap [0] [1] + "" + cloneMap [0] [2] + "" + cloneMap [1] [0] + "" + cloneMap [1 ] [1] + "" + cloneMap [1] [2 ]。
                    もし(!vis.contains(文字列)){ 
                        vis.add(STR); 
                        queue.offer(新しい POINT(XX、YY、ステップ+ 1 、cloneMap))。

        -1 ; 
    } 
}

 

おすすめ

転載: www.cnblogs.com/qinyuguan/p/11456576.html