幅優先探索の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 ; } }