leetcode505.迷宫2

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

  1. 这个题中,由于要找最近的距离,所以点是可以重复跑的,每次选最小距离,根据最小距离进行递归
  2. 注意还是不撞墙不能停的

代码

void dfs(int** maze, int mazeSize, int mazeColSize, int startx, int starty, int endx, int endy,int k,int len[][100]){
    if(startx<0||starty<0||startx>mazeSize||starty>mazeColSize||maze[startx][starty]==1){
        return;//撞墙 停
    }
    int up=startx-1;
    int down =startx+1;
    int left = starty-1;
    int right = starty+1;
    int t=0;
    while(up>=0&&maze[up][starty]!=1){
        up--;
    }
    t=abs(up+1-startx);
    if(len[up+1][starty]>len[startx][starty]+t){//只有当前的路径是最小的距离时,该路径才进行递归,否则该路径无效,但是不能返回,因为有四个方向,一个方向不行,还可能其他方向行,这个地方卡好久
        len[up+1][starty]=len[startx][starty]+t;
        dfs(maze, mazeSize, mazeColSize, up+1, starty, endx, endy, k+t,len);
    }
    while(down<mazeSize&&maze[down][starty]!=1){
        down++;
    }
    t=abs(down-1-startx);
    if(len[down-1][starty]>len[startx][starty]+t){
        len[down-1][starty]=len[startx][starty]+t;
        dfs(maze, mazeSize, mazeColSize, down-1, starty, endx, endy, k+t,len);
    }
        
    
    while(left>=0&&maze[startx][left]!=1){
        left--;
    }
    t= abs(left+1-starty);
    if(len[startx][left+1]>len[startx][starty]+t){
        len[startx][left+1]=len[startx][starty]+t;
        dfs(maze, mazeSize, mazeColSize, startx, left+1, endx, endy, k+t,len);
    }
        

    while(right<mazeColSize&&maze[startx][right]!=1){
        right++;
    }
    t =abs(right-1-starty);
    if(len[startx][right-1]>len[startx][starty]+t){
        len[startx][right-1]=len[startx][starty]+t;
        dfs(maze, mazeSize, mazeColSize, startx, right-1, endx, endy, k+t,len);
    }
        
}
int shortestDistance(int** maze, int mazeSize, int* mazeColSize, int* start, int startSize, int* destination, int destinationSize){
    int startx=start[0];
    int starty=start[1];
    int endx = destination[0];
    int endy = destination[1];
    int k =0,i,j;
    //int len=10000;
    int len[mazeSize][100];
    for(i=0;i<mazeSize;i++){
        for(j=0;j<100;j++){
            len[i][j]=10000;
        }
    }
    len[startx][starty]=0;
    dfs(maze,mazeSize,*mazeColSize,startx,starty,endx,endy,k,len);
    if(len[endx][endy]==10000)
        return -1;
    return  len[endx][endy];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值