在迷宫中有一个球,里面有空的空间和墙壁。球可以通过滚上
,下
,左
或右
移动,但它不会停止滚动直到撞到墙上。
当球停止时,它可以选择下一个方向。
给定球的起始位置,目的地和迷宫,确定球是否可以停在终点。
迷宫由二维数组表示。1表示墙和0表示空的空间。你可以假设迷宫的边界都是墙。开始和目标坐标用行和列索引表示。
例1:
输入:
map =
[
[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]
]
start = [0,4]
end = [3,2]
输出:
false
例2:
输入:
map =
[[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]
]
start = [0,4]
end = [4,4]
输出:
true
1.在迷宫中只有一个球和一个目的地。
2.球和目的地都存在于一个空的空间中,它们最初不会处于相同的位置。
3.给定的迷宫不包含边框(比如图片中的红色矩形),但是你可以假设迷宫的边界都是墙。
5.迷宫中至少有2个空的空间,迷宫的宽度和高度都不会超过100。
思路:使用BFS广度优先搜索,将遍历过得点记录的visited=true,然后将需要遍历的四个点的四个方向存在队列中。
class Solution {
public:
/**
* @param maze: the maze
* @param start: the start
* @param destination: the destination
* @return: whether the ball could stop at the destination
*/
bool hasPath(vector> &maze, vector &start, vector &destination) {
// write your code here
if(maze.size()==0 || maze[0].size()== 0){
return true;
}
int m = maze.size(), n = maze[0].size();
vector>dirs{{0,-1},{0,1},{-1,0},{1,0}};
vector>visited(m,vector(n,false));
queue>q;
q.push({start[0],start[1]});
visited[start[0]][start[1]] = true;
while(!q.empty()){
auto t = q.front();q.pop();
if(t.first == destination[0] && t.second == destination[1]) return true;
for(auto dir : dirs){
int x = t.first,y = t.second;
while(x >= 0 && x < m && y>=0 && y
DFS:思路还是一样,需要用到递归:
class Solution {
public:
/**
* @param maze: the maze
* @param start: the start
* @param destination: the destination
* @return: whether the ball could stop at the destination
*/
vector>dirs{{1,0},{-1,0},{0,1},{0,-1}};
bool hasPath(vector> &maze, vector &start, vector &destination) {
// write your code here
return DFS(maze,start[0],start[1],destination[0],destination[1]);
}
bool DFS(vector> &maze,int i,int j,int di,int dj){
if (i == di && j == dj) return true;
bool res = false;
int m = maze.size(), n = maze[0].size();
maze[i][j] = -1;
for(auto dir : dirs){
int x = i,y = j;
while(x>=0 && x=0 && y