[Leetcode] 505. The Maze II 解题报告
来源:互联网 发布:淘宝怎么设置花呗付款 编辑:程序博客网 时间:2024/05/16 02:34
题目:
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolling up, down, left or right, but it won't stop rolling until hitting a wall. When the ball stops, it could choose the next direction.
Given the ball's start position, the destination and the maze, find the shortest distance for the ball to stop at the destination. The distance is defined by the number of empty spaces traveled by the ball from the start position (excluded) to the destination (included). If the ball cannot stop at the destination, return -1.
The maze is represented by a binary 2D array. 1 means the wall and 0 means the empty space. You may assume that the borders of the maze are all walls. The start and destination coordinates are represented by row and column indexes.
Example 1
Input 1: a maze represented by a 2D array0 0 1 0 00 0 0 0 00 0 0 1 01 1 0 1 10 0 0 0 0Input 2: start coordinate (rowStart, colStart) = (0, 4)Input 3: destination coordinate (rowDest, colDest) = (4, 4)Output: 12Explanation: One shortest way is : left -> down -> left -> down -> right -> down -> right. The total distance is 1 + 1 + 3 + 1 + 2 + 2 + 2 = 12.
Example 2
Input 1: a maze represented by a 2D array0 0 1 0 00 0 0 0 00 0 0 1 01 1 0 1 10 0 0 0 0Input 2: start coordinate (rowStart, colStart) = (0, 4)Input 3: destination coordinate (rowDest, colDest) = (3, 2)Output: -1Explanation: There is no way for the ball to stop at the destination.
Note:
- There is only one ball and one destination in the maze.
- Both the ball and the destination exist on an empty space, and they will not be at the same position initially.
- The given maze does not contain border (like the red rectangle in the example pictures), but you could assume the border of the maze are all walls.
- The maze contains at least 2 empty spaces, and both the width and height of the maze won't exceed 100.
思路:
这种求最短路径的题目一般还是BFS比DFS靠谱一些。下面的代码是在[Leetcode] 490. The Maze 解题报告的基础上修改而来的。我们用一个map来记录已经访问过的位置以及其对应的最短路径。然后维护一个队列。每次取出队列头部,如果发现是destination了,就更新最终结果;否则就朝着四个方向前进直到到达障碍或者边界。此时如果发现结尾点的路径还要长一些,就需要进队列再次进行搜索了。当然本题目也可以不用map而直接用二维数组记录当前的各个位置上的搜索路径,虽然可能空间复杂度更高一些,但是时间复杂度会有所下降。
代码:
class Solution {public: int shortestDistance(vector<vector<int>>& maze, vector<int>& start, vector<int>& destination) { map<vector<int>, int> visited; vector<vector<int>> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; int ret = INT_MAX; visited[start] = 0; queue<vector<int>> q; q.push(start); while (!q.empty()) { vector<int> pos = q.front(); q.pop(); if (pos == destination) { ret = min(ret, visited[pos]); } else { for (int i = 0; i < 4; ++i) { vector<int> res = go2End(maze, pos, dirs[i]); int line_length = i <= 1 ? abs(pos[1] - res[1]) : abs(pos[0] - res[0]); if (visited.find(res) == visited.end() || visited[res] > visited[pos] + line_length) { visited[res] = visited[pos] + line_length; q.push(res); } } } } return ret == INT_MAX ? -1 : ret; }private: vector<int> go2End(vector<vector<int>> &maze, vector<int> start, vector<int> &dir) { vector<int> new_start = {start[0] + dir[0], start[1] + dir[1]}; int row_num = maze.size(), col_num = maze[0].size(); if(new_start[0] < 0 || new_start[0] >= row_num || new_start[1] < 0 || new_start[1] >= col_num || maze[new_start[0]][new_start[1]] == 1) { // already at the end return start; } return go2End(maze, new_start, dir); }};
- [Leetcode] 505. The Maze II 解题报告
- [Leetcode] 490. The Maze 解题报告
- [Leetcode] 499. The Maze III 解题报告
- 505. The Maze II
- 【LeetCode】Subsets II 解题报告
- 【LeetCode】Permutations II 解题报告
- [LeetCode] Permutations II 解题报告
- [LeetCode] Subsets II 解题报告
- Subset II [Leetcode 解题报告]
- Permutations II [Leetcode 解题报告]
- LeetCode — Word Break II 解题报告
- [LeetCode]Unique Paths II, 解题报告
- [LeetCode]Reverse Linked List II, 解题报告
- Leetcode Jump Game II 解题报告
- Leetcode Word Ladder II 解题报告
- LeetCode解题报告 --- Single Number II
- LeetCode Word Break II 解题报告
- LeetCode — Single Number II 解题报告
- 编写高质量iOS与OS X代码的52个有效方法 读后感
- 基于springboot+bootstrap+mysql+redis搭建一套完整的权限架构【三】【整合swagger2和druid】
- 编写多线程程序,模拟多个人通过一个山洞。这个山洞每次只能通过一个人,每个人通过山洞的时间为2秒(sleep)。随机生成10个人,都要通过此山洞,用随机值对应的字符串表示人名,打印输出每次通过山洞的人名
- 【Scikit-Learn 中文文档】四十八:数据转换和预测变量的组合模型- 关于科学数据处理的统计学习教程
- 67. Add Binary
- [Leetcode] 505. The Maze II 解题报告
- vim编辑器操作命令大全-绝对全
- 第一章作业1-数据结构基本概念
- key对应多值
- iOS编程基础-OC(八)-运行时系统的结构
- 文件上传时只接收指定的文件类型
- websocket 心得
- 新手java web 技术交流群
- python selenium自动化测试之牛刀小试——爬虫