Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle)
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;
Set<String> vis = new HashSet<>();
Queue<POINT> 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;
}
}
Leetcode之广度优先搜索(BFS)专题-773. 滑动谜题(Sliding Puzzle)的更多相关文章
- [Swift]LeetCode773. 滑动谜题 | Sliding Puzzle
On a 2x3 board, there are 5 tiles represented by the integers 1 through 5, and an empty square repre ...
- Leetcode之广度优先搜索(BFS)专题-详解429. N叉树的层序遍历(N-ary Tree Level Order Traversal)
Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tree Level Order Traversal) 给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右 ...
- Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder)
Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...
- Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock)
Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...
- Leetcode之广度优先搜索(BFS)专题-1162. 地图分析(As Far from Land as Possible)
Leetcode之广度优先搜索(BFS)专题-1162. 地图分析(As Far from Land as Possible) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. ...
- Leetcode之广度优先搜索(BFS)专题-994. 腐烂的橘子(Rotting Oranges)
Leetcode之广度优先搜索(BFS)专题-994. 腐烂的橘子(Rotting Oranges) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ar ...
- Leetcode之广度优先搜索(BFS)专题-279. 完全平方数(Perfect Squares)
Leetcode之广度优先搜索(BFS)专题-279. 完全平方数(Perfect Squares) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ar ...
- Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph)
Leetcode之广度优先搜索(BFS)专题-133. 克隆图(Clone Graph) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tree ...
- Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper)
Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...
随机推荐
- java上传大文件解决方案
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在10G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以10G来进行限制. 第一步: 前端修改 由于项目使用的是BJ ...
- hdu 5726 GCD GCD+线段树+区间预处理+map
GCD Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- K 短路
这种东西到现在才学-- 考虑 \(T\) 为根的最短路树,一条路径一定是树上边和非树边交错. 我们只管非树边,对于一条路径,非树边构成一个序列 \(L\),相邻两条路径 \(\left(u_1,v_1 ...
- 【WebStorm】前端工具开发利器webstrom专篇
---------------------------------------------------------------------------------[亲身实测] WebStorm混搭sv ...
- HTML标签功能分类
按功能类别对HTML标签进行分类,源自HTML 参考手册 基础 标签 描述 <!DOCTYPE> 定义文档类型. html 定义 HTML 文档. title 定义文档的标题. body ...
- Runtime Error R6034 Application has attempt to load the C runtime library incorrectly
1.问题描述 vs2015 去开发一个写入pg数据库的程序,使用libpqxx.dll,libpq.dll,这个库文件之前是用vs2008的程序中复制过来的,基于的运行时库应该是vs2008,现在开发 ...
- 用grep来查询日志
转自:http://www.itokit.com/2013/0308/74883.html linux系统中,利用grep打印匹配的上下几行 如果在只是想匹配模式的上下几行,grep可以实现. ...
- java加密算法相关
简介 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年首次公布,当 ...
- mongodb 单节点集群配置 (开发环境)
最近项目会用到mongodb的oplog触发业务流程,开发时的debug很不方便.所以在本地创建一个单台mongodb 集群进行开发debug. 大概:mongodb可以产生oplog的部署方式应该是 ...
- CMD命令行管道命令
一.什么是管道命令 管道命令能够将一个命令的执行结果经过筛选,只保留我们需要的信息. 如 dir 命令会显示目录下所有文件夹和文件,可以使用管道命令| findstr "" 将di ...