原题链接:https://leetcode.com/articles/the-maze/

这道题目是需要冲会员才能使用的,然而我个穷逼现在还是失业状态根本冲不起。。。以后如果把免费题目都刷完了的话,再来冲会员刷这些题目吧!

我的思路

迷宫类问题首先想到的就是回溯法了,思考+实现用了近 3 个小时,终于又写出了简单粗暴的实现来了:

import java.util.Stack;

/**
* Created by clearbug on 2018/2/26.
*/
public class Solution { public static void main(String[] args) {
Solution s = new Solution();
/**
* 0 0 1 0 0
0 0 0 0 0
0 0 0 1 0
1 1 0 1 1
0 0 0 0 0
*/
int[][] board = {
{0, 0, 1, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 1, 0},
{1, 1, 0, 1, 1},
{0, 0, 0, 0, 0},
};
System.out.println(s.traverse(board, 0, 4, 4, 4)); /**
* 0 0 1 0 0
0 0 0 0 0
0 0 0 1 0
1 1 0 1 1
0 0 0 0 0 */
int[][] board2 = {
{0, 0, 1, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 1, 0},
{1, 1, 0, 1, 1},
{0, 0, 0, 0, 0},
};
System.out.println(s.traverse(board2, 0, 4, 3, 2));
} public Stack<String> traverse(int[][] board, int rowStart, int colStart, int rowDest, int colDest) {
board[rowStart][colStart] = -1; // 标记起始位置已来过 Stack<String> res = new Stack<>();
boolean dfsRes = dfs(board, rowStart, colStart, rowDest, colDest, res);
System.out.println(dfsRes);
return res;
} public boolean dfs(int[][] board, int rowStart, int colStart, int rowDest, int colDest, Stack<String> res) {
if (rowStart == rowDest && colStart == colDest) { // 说明已抵达目的地
return true;
} boolean exist = false; // up
int upRow = rowStart - 1;
while (upRow >= 0 && board[upRow][colStart] < 1) { // board[upRow][colStart] = 0 or board[upRow][colStart] = -1
exist = true;
upRow--;
}
if (exist) {
upRow++;
res.push("up");
if (upRow == rowDest && colStart == colDest) { // 说明已抵达目的地
return true;
}
if (board[upRow][colStart] == -1) { // 说明来过这个位置,目前又循环回来了,所以是死路
res.pop();
} else {
board[upRow][colStart] = -1; // 标记这个位置已来过
if (dfs(board, upRow, colStart, rowDest, colDest, res)) {
return true;
} else {
res.pop();
}
}
} exist = false;
// down
int downRow = rowStart + 1;
while (downRow < board.length && board[downRow][colStart] < 1) { // board[downRow][colStart] = 0 or board[downRow][colStart] = -1
exist = true;
downRow++;
}
if (exist) {
downRow--;
res.push("down");
if (downRow == rowDest && colStart == colDest) { // 说明已抵达目的地
return true;
}
if (board[downRow][colStart] == -1) { // 说明来过这个位置,目前又循环回来了,所以是死路
res.pop();
} else {
board[downRow][colStart] = -1; // 标记这个位置已来过
if (dfs(board, downRow, colStart, rowDest, colDest, res)) {
return true;
} else {
res.pop();
}
}
} exist = false;
// left
int leftCol = colStart - 1;
while (leftCol >= 0 && board[rowStart][leftCol] < 1) {
exist = true;
leftCol--;
}
if (exist) {
leftCol++;
res.push("left");
if (rowStart == rowDest && leftCol == colDest) {
return true;
}
if (board[rowStart][leftCol] == -1) {
res.pop();
} else {
board[rowStart][leftCol] = -1;
if (dfs(board, rowStart, leftCol, rowDest, colDest, res)) {
return true;
} else {
res.pop();
}
}
} exist = false;
// right
int rightCol = colStart + 1;
while (rightCol < board[rowStart].length && board[rowStart][rightCol] < 1) {
exist = true;
rightCol++;
}
if (exist) {
rightCol--;
res.push("right");
if (rowStart == rowDest && rightCol == colDest) {
return true;
}
if (board[rowStart][rightCol] == -1) {
res.pop();
} else {
board[rowStart][rightCol] = -1;
if (dfs(board, rowStart, rightCol, rowDest, colDest, res)) {
return true;
} else {
res.pop();
}
}
} return false;
} }

当然了,可以使用类似骑士游历问题中的预测算法来提高效率。下面就来看看官方解答是怎么的吧!

官方方法一(深入优先搜索)

深度优先搜索,英文全称为 Depth First Search,简称为 DFS。毫无疑问,跟我的思路是一样的,就是代码更加简洁,所以我的解法其实就是深度优先搜索啦!

官方解法二(广度优先搜索)

广度优先搜索,英文全称 Breadth First Search,简称 BFS。不过我思考了下,这种广度优先搜索算法最终是无法求出小球所走过的路径的,只能判断小球最终是否会到达目的地。还是按照惯例抄袭一遍代码就当学会了吧:

import java.util.LinkedList;
import java.util.Stack;
import java.util.Queue; /**
* Created by clearbug on 2018/2/26.
*/
public class Solution { public static void main(String[] args) {
Solution s = new Solution();
/**
* 0 0 1 0 0
0 0 0 0 0
0 0 0 1 0
1 1 0 1 1
0 0 0 0 0
*/
int[][] board = {
{0, 0, 1, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 1, 0},
{1, 1, 0, 1, 1},
{0, 0, 0, 0, 0},
};
System.out.println(s.hasPath(board, new int[]{0, 4}, new int[]{4, 4})); /**
* 0 0 1 0 0
0 0 0 0 0
0 0 0 1 0
1 1 0 1 1
0 0 0 0 0 */
int[][] board2 = {
{0, 0, 1, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 1, 0},
{1, 1, 0, 1, 1},
{0, 0, 0, 0, 0},
};
System.out.println(s.hasPath(board2, new int[]{0, 4}, new int[]{3, 2}));
} public boolean hasPath(int[][] maze, int[] start, int[] dest) {
boolean[][] visited = new boolean[maze.length][maze[0].length];
visited[start[0]][start[1]] = true; int[][] dirs = {
{0, 1},
{0, -1},
{-1, 0},
{1, 0}
}; Queue<int[]> queue = new LinkedList<>();
queue.add(start); while (!queue.isEmpty()) {
int[] s = queue.remove();
if (s[0] == dest[0] && s[1] == dest[1]) {
return true;
}
for (int[] dir : dirs) {
int x = s[0] + dir[0];
int y = s[1] + dir[1];
while (x >= 0 && y >= 0 && x < maze.length && y < maze[0].length && maze[x][y] == 0) {
x += dir[0];
y += dir[1];
}
if (!visited[x - dir[0]][y - dir[1]]) {
queue.add(new int[]{x - dir[0], y - dir[1]});
visited[x - dir[0]][y - dir[1]] = true;
}
}
} return false;
} }

490. The Maze的更多相关文章

  1. [LeetCode] 490. The Maze 迷宫

    There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...

  2. LeetCode 490. The Maze

    原题链接在这里:https://leetcode.com/problems/the-maze/ 题目: There is a ball in a maze with empty spaces and ...

  3. [LC] 490. The Maze

    There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...

  4. 【LeetCode】490. The Maze 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS 日期 题目地址:https://leetcod ...

  5. [LeetCode] 499. The Maze III 迷宫 III

    There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...

  6. [LeetCode] 505. The Maze II 迷宫 II

    There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...

  7. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

  8. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

  9. 算法与数据结构基础 - 深度优先搜索(DFS)

    DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...

随机推荐

  1. # # # Vue的分环境打包

    我们使用Vue-cli的默认环境是只有dev和prod两种环境,在开发中我们的项目一般是开发版.测试版.pre版.Prod版.我们一般是在源码中API地址中修改后然后打包. ###1.首先安装cros ...

  2. docker出现相同的image条目的删除办法

    一.问题:在测试docker安装的prometheus系统时,由于异常操作,使用docker image ls出现了两条一模一样的条目,如下: [root@ELK prometheus]# docke ...

  3. Spring Cloud 系列之 Apollo 配置中心(一)

    背景 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关.参数的配置.服务器的地址等等. 对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境.分集群管理配置,完善的权限.审核机 ...

  4. Chisel3 - Tutorial - Functionality

    https://mp.weixin.qq.com/s/3hDzpJiANdwp07hO03psyA   演示使用函数进行代码复用的方法.   参考链接: https://github.com/ucb- ...

  5. Java实现 LeetCode 815 公交路线(创建关系+BFS)

    815. 公交路线 我们有一系列公交路线.每一条路线 routes[i] 上都有一辆公交车在上面循环行驶.例如,有一条路线 routes[0] = [1, 5, 7],表示第一辆 (下标为0) 公交车 ...

  6. Java实现桐桐的数学难题

    桐桐的数学难题 题目描述 今天数学课上,桐桐学习了质数的知识:一个正整数如果只能被1和它本身整除,那么这个整数便是质数.桐桐就想:任意一个正整数是否都能分解成若干个质数相乘的形式呢?输入一个正整数n( ...

  7. Java实现 LeetCode 342 4的幂

    342. 4的幂 给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方. 示例 1: 输入: 16 输出: true 示例 2: 输入: 5 输出: false 进阶: 你 ...

  8. Java实现 LeetCode 101 对称二叉树

    101. 对称二叉树 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2 ...

  9. Spring Data JPA入门及深入

    一:Spring Data JPA简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问 ...

  10. 扩展.Django-权限系统

    目录 Django权限系统auth User 新建用户 认证用户 修改密码 登录 退出登录 只允许登录的用户访问 Group Permission 检查用户权限 管理用户权限 自定义权限 Django ...