在乙個 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 謎板被解開。給出乙個謎板的初始狀態,返回最少可以通過多少次移動解開謎板,如果不能解開謎板,...