Leetcode 773 滑動謎題 C

2021-10-08 19:43:34 字數 1824 閱讀 2970

在乙個 2 x 3 的板上(board)有 5 塊磚瓦,用數字 1~5 來表示, 以及一塊空缺用 0 來表示.

一次移動定義為選擇 0 與乙個相鄰的數字(上下左右)進行交換.

最終當板 board 的結果是 [[1,2,3],[4,5,0]] 謎板被解開。

給出乙個謎板的初始狀態,返回最少可以通過多少次移動解開謎板,如果不能解開謎板,則返回 -1 。

輸入:board = [[1,2,3],[4,0,5]]

輸出:1

解釋:交換 0 和 5 ,1 步完成

輸入:board = [[1,2,3],[5,4,0]]

輸出:-1

解釋:沒有辦法完成謎板

輸入:board = [[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]]

輸入:board = [[3,2,4],[1,5,0]]

輸出:14

board 是乙個如上所述的 2 x 3 的陣列.

board[i][j] 是乙個 [0, 1, 2, 3, 4, 5] 的排列.

bfs

棋盤雜湊,我們用每個各自拼接成的字串表示乙個棋盤的狀態;為了快速找到0的位置,我們需要記錄其位置;bfs找最短步數。詳細過程見**

#define m 2

#define n 3

class

chess}}

};class

solution

}return

true;}

string chesstostr

(vectorint>>

& board)

return now;

}int

slidingpuzzle

(vectorint>>

& board)

now +

=to_string

(board[i]

[j]);}

} unordered_set used;

//已有狀態

used.

insert

(now)

; target[m-1]

[n-1]=

0;int dir[4]

[2]=

,,,}

; queue q;

q.push

(chess

(zerox,zeroy,board));

int ans =-1

,size;

while

(!q.

empty()

) chess[now.zerox+dir[i][0

]][now.zeroy+dir[i][1

]]= chess[now.zerox]

[now.zeroy]

; chess[now.zerox]

[now.zeroy]=0

;}}}

}return-1

;}};

773 滑動謎題

在乙個 2 x 3 的板上 board 有 5 塊磚瓦,用數字1 5來表示,以及一塊空缺用0來表示.一次移動定義為選擇0與乙個相鄰的數字 上下左右 進行交換.最終當板board的結果是 1,2,3 4,5,0 謎板被解開。給出乙個謎板的初始狀態,返回最少可以通過多少次移動解開謎板,如果不能解開謎板,...

2020 5 leetcode 773 滑動謎題

1.關鍵點 利用編碼函式,將矩陣變為整數,作為儲存的狀態。再利用解碼函式,將狀態變為矩陣,進行bfs 新狀態的遍歷。進行bfs遍歷來找到最小移動次數。class solution intslidingpuzzle vectorint board int ans bfs x,y,board retur...

LeeCode 773 滑動謎題

在乙個 2 x 3 的板上 board 有 5 塊磚瓦,用數字1 5來表示,以及一塊空缺用0來表示.一次移動定義為選擇0與乙個相鄰的數字 上下左右 進行交換.最終當板board的結果是 1,2,3 4,5,0 謎板被解開。給出乙個謎板的初始狀態,返回最少可以通過多少次移動解開謎板,如果不能解開謎板,...