leetcode490 迷宫

在迷宫中有一个球,里面有空的空间和墙壁。球可以通过滚移动,
但它不会停止滚动直到撞到墙上。当球停止时,它可以选择下一个方向。

给定球的起始位置,目的地和迷宫,确定球是否可以停在终点。

迷宫由二维数组表示。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

 

你可能感兴趣的:(leetcode490 迷宫)