LeetCode1391 :检查网络中是否存在有效路径

7 篇文章 0 订阅
3 篇文章 0 订阅

分析:路径选择,一定是在上下左右中选择一条,如果存在路径的话,对每一条可行的路径进行测试;如果都不可选择的话,则不存在路径。

从第一步开始,每一步,其下一步该往哪走都是固定不变的,一定是上下左右中的一种。只是我们并不知道究竟是哪一个,所以需要进行比较,找到符合条件的位置(如果存在的话)。找到后,再找下一个,如此往复。


//helper()的作用是进入下一个位置,但是并不知道下一个位置是否合法
//x,y是当前位置,dir 是上一个位置到达x, y所走的方向
bool helper(int** grid, int gridSize, int* gridColSize, int x, int y, int dir){
    
    //注意数组越界
    if (x >= gridSize || y >= gridColSize[0] 
        || x < 0 || y < 0)
        return false;
    
    //到达右下角,仍需进行判断
    if (x == gridSize - 1 && y == gridColSize[0] - 1){
        if (dir == 0)
            return grid[x][y] == 1 || grid[x][y] == 3 || grid[x][y] == 5;
        else if (dir == 1)
            return grid[x][y] == 2 || grid[x][y] == 5 || grid[x][y] == 6; 
        return false;
    }

    //向右
    //寻找能够与往右方向进行衔接的节点
    //如果不能衔接,直接返回false
    if (dir == 0) {
        if (grid[x][y] == 1)
            return helper(grid, gridSize, gridColSize, x, y + 1, 0);
        else if (grid[x][y] == 3)
            return helper(grid, gridSize, gridColSize, x + 1, y, 1);
        else if (grid[x][y] == 5)
            return helper(grid, gridSize, gridColSize, x - 1, y, 3);
        return false;
    }

    //向下
    if (dir == 1) {
        if (grid[x][y] == 2)
            return helper(grid, gridSize, gridColSize, x + 1, y, 1);
        else if (grid[x][y] == 5)
            return helper(grid, gridSize, gridColSize, x, y - 1, 2);
        else if (grid[x][y] == 6)
            return helper(grid, gridSize, gridColSize, x, y + 1, 0);
        return false;
    }

    //向左
    if (dir == 2) {
        if (grid[x][y] == 1)
            return helper(grid, gridSize, gridColSize, x, y - 1, 2);
        else if (grid[x][y] == 4)
            return helper(grid, gridSize, gridColSize, x + 1, y, 1);
        else if (grid[x][y] == 6)
            return helper(grid, gridSize, gridColSize, x - 1, y, 3);
        return false;
    }

    //向上
    if (dir == 3) {
        if (grid[x][y] == 2)
            return helper(grid, gridSize, gridColSize, x - 1, y, 3);
        else if (grid[x][y] == 3)
            return helper(grid, gridSize, gridColSize, x, y - 1, 2);
        else if (grid[x][y] == 4)
            return helper(grid, gridSize, gridColSize, x, y + 1, 0);
        return false;
    }
    return false;
}


bool hasValidPath(int** grid, int gridSize, int* gridColSize)
{
     if (grid == NULL || gridSize < 1 || gridColSize == NULL || gridColSize[0] < 1) {
        return false;
    }
    
    if (gridSize == 1 && gridColSize[0] == 1) {
        return true;
    }
    
    if (grid[0][0] == 5) {
        return false;
    }
	
	//在左上角开始时,只有3种选择:只能向下、只能向右、既能向下又能向右
	//1.向右
    if (grid[0][0] == 1 || grid[0][0] == 6)
        return helper(grid, gridSize, gridColSize, 0, 1, 0);
    //2.向下
    else if (grid[0][0] == 2 || grid[0][0] == 3)	
        return helper(grid, gridSize, gridColSize, 1, 0, 1);
    
    //3.向下和向右
    return helper(grid, gridSize, gridColSize, 0, 1, 0) 
            || helper(grid, gridSize, gridColSize, 1, 0, 1);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值