leetcode490. 迷宫

在这里插入图片描述
在这里插入图片描述
思路

  1. 注意是撞到墙才停止滚动,四个方向上都能滚动
  2. 可能会滚到重复的停止位置,如果停到重复的位置就是无法滚到终点,所以标记的是停止的位置,路径是可以交叉的,如图
  3. 不能给停止的位置标记为1,如果滚动一次刚好在终点旁边,那么第二次就会在终点停止,但是这次是错误的
  4. 是找到是否有从起点到终点的位置,四个方向上递归只要有一个找到就行
    在这里插入图片描述
    在这里插入图片描述

代码

bool dfs(int** maze, int mazeSize, int mazeColSize, int startx, int starty, int endx, int endy){
	//判断停止位置
    if(startx<0||starty<0||startx>=mazeSize||starty>= mazeColSize||maze[startx][starty] == 1||maze[startx][starty] == 2)
        return false;
    if(startx==endx&&starty==endy){
        return true;
    }
 	//停止位置标记
    maze[startx][starty] = 2;
    //从上下左右四个方向开始
    int up = startx-1;
    int down = startx+1;
    int left = starty-1;
    int right = starty+1;
    //向上一直到墙,或者超出范围,其实也是墙停止
    while(up>=0&&maze[up][starty]!=1){
        up--;
    }
    //从该停止位置开始,由于up是在墙时出循环,所以回退1,对该停止位置进行dfs
    if(dfs(maze,mazeSize, mazeColSize, up+1, starty, endx, endy))
        return true;

    while(down<mazeSize&&maze[down][starty]!=1){
        down++;
    }
    if(dfs(maze,mazeSize, mazeColSize, down-1, starty, endx, endy))
        return true;

    while(left>=0&&maze[startx][left]!=1){
        left--;
    }
    if(dfs(maze,mazeSize, mazeColSize, startx, left+1, endx, endy))
        return true;

    while(right<mazeColSize&&maze[startx][right]!=1){
        right++;
    }
    if(dfs(maze,mazeSize, mazeColSize, startx, right-1, endx, endy))
        return true;

    return  false;
}

bool hasPath(int** maze, int mazeSize, int* mazeColSize, int* start, int startSize, int* destination, int destinationSize){
    int startx = start[0],starty=start[1];
    int endx = destination[0],endy = destination[1];

    return dfs(maze, mazeSize, *mazeColSize, startx, starty, endx, endy);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值