Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle)
BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tree Level Order Traversal)
相同思路的题目:Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock)
相同思路的题目2:Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder)
在一个 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]
的排列.
0每次只能和他的上下左右交换,利用一个vis数组,参考相似题目思路,求解题目。
相同思路的题目:Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock)
相同思路的题目2:Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder)
本题AC代码:
class Solution { int[] dirx = {1, -1, 0, 0}; int[] diry = {0, 0, 1, -1}; private static class POINT { int x, y; int step; int[][] board; POINT(int x, int y, int step, int[][] board) { this.x = x; this.y = y; this.step = step; this.board = board; } } public int slidingPuzzle(int[][] board) { int m = 2; int n = 3; Setvis = new HashSet<>(); Queue queue = new LinkedList<>(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (board[i][j] == 0) { vis.add(board[0][0] + " " + board[0][1] + " " + board[0][2] + " " + board[1][0] + " " + board[1][1] + " " + board[1][2]); queue.offer(new POINT(i, j, 0, board)); } } } while (!queue.isEmpty()) { POINT temp = queue.poll(); int x = temp.x; int y = temp.y; int step = temp.step; int[][] map = temp.board; if (map[0][0] == 1 && map[0][1] == 2 && map[0][2] == 3 && map[1][0] == 4 && map[1][1] == 5 && map[1][2] == 0) { return step; } for (int i = 0; i < 4; i++) { int[][] cloneMap = new int[m][n]; for (int a = 0; a < m; a++) { System.arraycopy(map[a], 0, cloneMap[a], 0, n); } int xx = x + dirx[i]; int yy = y + diry[i]; if (xx >= 0 && yy >= 0 && xx < m && yy < n) { cloneMap[x][y] = cloneMap[xx][yy]; cloneMap[xx][yy] = 0; String str = cloneMap[0][0] + " " + cloneMap[0][1] + " " + cloneMap[0][2] + " " + cloneMap[1][0] + " " + cloneMap[1][1] + " " + cloneMap[1][2]; if (!vis.contains(str)) { vis.add(str); queue.offer(new POINT(xx, yy, step + 1, cloneMap)); } } } } return -1; } }