3x3のボード上に、8枚の1〜8の整数で表されるタイル、及び0で表される空の正方形があります。
動きは0と4方向に隣接する番号を選択し、それをスワップから成ります。
、パズルボードの初期状態と最終状態を考えると動きの最小数を返し、最終的な状態になるように、初期状態を必要としていました。
それは初期状態から最終状態へ移動することは不可能である場合は、-1を返します。
例
例1:
Input:
[
[2,8,3],
[1,0,4],
[7,6,5]
]
[
[1,2,3],
[8,0,4],
[7,6,5]
]
Output:
4
Explanation:
[ [
[2,8,3], [2,0,3],
[1,0,4], --> [1,8,4],
[7,6,5] [7,6,5]
] ]
[ [
[2,0,3], [0,2,3],
[1,8,4], --> [1,8,4],
[7,6,5] [7,6,5]
] ]
[ [
[0,2,3], [1,2,3],
[1,8,4], --> [0,8,4],
[7,6,5] [7,6,5]
] ]
[ [
[1,2,3], [1,2,3],
[0,8,4], --> [8,0,4],
[7,6,5] [7,6,5]
] ]
例2:
Input: [[2,3,8],[7,0,5],[1,6,4]] [[1,2,3],[8,0,4],[7,6,5]] Output: -1
パブリック クラスソリューション{ / ** * @param init_state:チェス盤の初期状態 * @paramのfinal_state:チェス盤の最終状態 * @return :最小移動の数を表す整数を返す * / パブリック INT minMoveStep(INT [] [] init_state、INT [] [] final_state){ // #ここにあなたのコードを記述 文字列開始= matrixToStr(init_state)。 ストリングの端 = matrixToStr(final_state)。 int型のステップ= 0。 セット <文字列>訪問= 新しい HashSetの<> (); キュー <文字列>キュー= 新しい LinkedListは<> (); queue.offer(スタート)。 visited.add(スタート)。 しばらく(!queue.isEmpty()){ int型のサイズ= queue.size(); 一方、(size--> 0 ){ 文字列CUR = queue.poll()。 もし(cur.equals(終了)){ 戻りステップと } のための(文字列NXT:getNextを(CUR)){ もし(visited.containsは(NXT)){ 続けます。 } queue.offer(NXT)。 visited.add(NXT)。 } } ステップ + = 1 ; } 戻り -1 。 } プライベートストリングmatrixToStr(INT [] []行列){ StringBuilderのSB = 新規のStringBuilder(); 以下のために(INT ; I <matrix.length; iが0 = Iは++ ){ ため(INTJ = 0; J <行列[0] .LENGTH。J ++ ){ sb.append(行列[I] [J])。 } } を返す)(sb.toStringします。 } プライベートリストの<string> getNextを(文字列CUR){ リストの<string>リスト= 新規のArrayList <> (); INT zeroIdx = cur.indexOf( "0" )。 int型 curRow = zeroIdx / 3 。 INT curCol = zeroIdx%3 。 INT [] []方向= 新しい INT [] [] {{ - 1,0}、{1,0}、{0、-1}、{0,1 }}。 以下のための(int型[]方向:方向){ int型 nxtRow = curRow +方位[0 ]。 INT nxtCol = curCol +方位[1 ]。 もし(nxtRow <0 || nxtRow> = 3 || nxtCol <0 || nxtCol> = 3 ){ 続けます。 } のchar [] CHARARR = cur.toCharArray()。 CHARARR [zeroIdx] = CHARARR [nxtRow * 3 + nxtCol]。 CHARARR [nxtRow * 3 + nxtCol] = '0' 。 list.add(新しい文字列(CHARARR)); } 戻りリスト。 } }