博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] The Maze II 迷宫之二
阅读量:7135 次
发布时间:2019-06-28

本文共 4666 字,大约阅读时间需要 15 分钟。

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:

  1. There is only one ball and one destination in the maze.
  2. Both the ball and the destination exist on an empty space, and they will not be at the same position initially.
  3. 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.
  4. The maze contains at least 2 empty spaces, and both the width and height of the maze won't exceed 100.

这道题是之前那道的拓展,那道题只让我们判断能不能在终点位置停下,而这道题让我们求出到达终点的最少步数。其实本质都是一样的,难点还是在于对于一滚到底的实现方法,唯一不同的是,这里我们用一个二位数组dists,其中dists[i][j]表示到达(i,j)这个位置时需要的最小步数,我们都初始化为整型最大值,在后在遍历的过程中不断用较小值来更新每个位置的步数值,最后我们来看终点位置的步数值,如果还是整型最大值的话,说明没法在终点处停下来,返回-1,否则就返回步数值。注意在压入栈的时候,我们对x和y进行了判断,只有当其不是终点的时候才压入栈,这样是做了优化,因为如果小球已经滚到终点了,我们就不要让它再滚了,就不把终点位置压入栈,免得它还滚,参见代码如下:

解法一:

public:    int shortestDistance(vector
>& maze, vector
& start, vector
& destination) { int m = maze.size(), n = maze[0].size(); vector
> dists(m, vector
(n, INT_MAX)); vector
> dirs{ { 0,-1},{-1,0},{ 0,1},{ 1,0}}; queue
> q; q.push({start[0], start[1]}); dists[start[0]][start[1]] = 0; while (!q.empty()) { auto t = q.front(); q.pop(); for (auto d : dirs) { int x = t.first, y = t.second, dist = dists[t.first][t.second]; while (x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == 0) { x += d[0]; y += d[1]; ++dist; } x -= d[0]; y -= d[1]; --dist; if (dists[x][y] > dist) { dists[x][y] = dist; if (x != destination[0] || y != destination[1]) q.push({x, y}); } } } int res = dists[destination[0]][destination[1]]; return (res == INT_MAX) ? -1 : res; }};

下面这种写法是DFS的解法,可以看出来思路基本上跟上面的解法没有啥区别,写法上稍有不同,参见代码如下:

解法二:

public:    vector
> dirs{
{
0,-1},{-1,0},{
0,1},{
1,0}}; int shortestDistance(vector
>& maze, vector
& start, vector
& destination) { int m = maze.size(), n = maze[0].size(); vector
> dists(m, vector
(n, INT_MAX)); dists[start[0]][start[1]] = 0; helper(maze, start[0], start[1], destination, dists); int res = dists[destination[0]][destination[1]]; return (res == INT_MAX) ? -1 : res; } void helper(vector
>& maze, int i, int j, vector
& destination, vector
>& dists) { if (i == destination[0] && j == destination[1]) return; int m = maze.size(), n = maze[0].size(); for (auto d : dirs) { int x = i, y = j, dist = dists[x][y]; while (x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == 0) { x += d[0]; y += d[1]; ++dist; } x -= d[0]; y -= d[1]; --dist; if (dists[x][y] > dist) { dists[x][y] = dist; helper(maze, x, y, destination, dists); } } }};

本文转自博客园,原文链接:

,如需转载请自行联系原博主。

你可能感兴趣的文章
Codeforces Bubble Cup 8 - Finals [Online Mirror] F. Bulbo DP
查看>>
HTML5+NodeJs实现WebSocket即时通讯
查看>>
Gradle 载入中 Android 下一个.so档
查看>>
log4写完日志不会自动释放
查看>>
【学生信息管理系统】与后端系统接口
查看>>
取缔Chrome装载电脑管家的广告过滤脚本代码
查看>>
【转】做好软件测试需要具备的思维方式
查看>>
Win7中的路由转发配置实验
查看>>
2015第40周六
查看>>
bootstrap之DumpWindowHierarchy
查看>>
BZOJ 2190 SDOI 2008 仪仗队 线性欧拉筛
查看>>
VSS
查看>>
[转]Informatica vs SSIS
查看>>
第二篇 顾问实施ERP与医生看病过程类比
查看>>
深入WSGI,并按样例实现一个
查看>>
每天一个linux命令(33):ps命令
查看>>
源代码版本控制工具TortoiseSVN,AnkhSVN最新版本下载地址
查看>>
林达华解说数学体系
查看>>
猫学习IOS(三)UI纯代码UI——图片浏览器
查看>>
guslterFS
查看>>