【bfs】B016_最短最少拐彎路徑(bfs)

一、題目描述


二、題解

方法一:bfs

這一題沒有以往的網格題那麼常規,但是本質是一樣的,用 dfs,bfs 都行。

算法

  • 下一步要到達的目的地要根據當前位置 grid[cur.x][cur.y] 才能判斷出來。就這麼簡單。

* 邊界錯誤:第一次嘗試的時候,發現邊界錯誤了,原因竟然是…

class Solution {
    int R, C;
    boolean[][] vis;
    public boolean hasValidPath(int[][] grid) {
        R = grid.length; 
        C = grid[0].length;

        vis = new boolean[R][C];
        vis[0][0] = true;
        Queue<Pos> q = new LinkedList<>();
        q.add(new Pos(0, 0));   

        while (!q.isEmpty()) {
            Pos cur = q.poll();

            if (cur.x == R-1 && cur.y == C-1)
                return true;
			
			//向左走
            if (grid[cur.x][cur.y] == 1 || grid[cur.x][cur.y] == 3 || grid[cur.x][cur.y] == 5) {
                int L = cur.y - 1;
                if (L >= 0 && !vis[cur.x][L] && grid[cur.x][L] == 1 || grid[cur.x][L] == 4 || grid[cur.x][L] == 6) {
                    q.add(new Pos(cur.x, L));
                    vis[cur.x][L] = true;
                }
            }
			//向右走
            if (grid[cur.x][cur.y] == 1 || grid[cur.x][cur.y] == 4 || grid[cur.x][cur.y] == 6) {
                int R = cur.y + 1;
                if (R < C && !vis[cur.x][R] && grid[cur.x][R] == 1 || grid[cur.x][R] == 3 || grid[cur.x][R] == 5) {
                    q.add(new Pos(cur.x, R));
                    vis[cur.x][R] = true;
                }
            }
            //向上走
            if (grid[cur.x][cur.y] == 2 || grid[cur.x][cur.y] == 5 || grid[cur.x][cur.y] == 6) {
                int U = cur.x - 1;
                if (U >= 0 && !vis[U][cur.y] && grid[U][cur.y] == 2 || grid[U][cur.y] == 3 || grid[U][cur.y] == 4) {
                    q.add(new Pos(U, cur.y));
                    vis[U][cur.y] = true;
                }
            }
			//向下走
            if (grid[cur.x][cur.y] == 2 || grid[cur.x][cur.y] == 3 || grid[cur.x][cur.y] == 4) {
                int D = cur.x + 1;
                if (D < R && !vis[D][cur.y] && grid[D][cur.y] == 2 || grid[D][cur.y] == 5 || grid[D][cur.y] == 6) {
                    q.add(new Pos(D, cur.y));
                    vis[D][cur.y] = true;
                }
            }
        }
        return false;
    }

    class Pos {
        int x, y;
        public Pos(int _x, int _y) {
            x = _x;
            y = _y;
        }
    }
}

*錯誤原因: 原來是因爲沒有給 第二個 if 的後半截 或者|| 加上一組括號,導致出界了。這導致在競賽中浪費了 15 分鐘。

int R, C;
boolean[][] vis;
public boolean hasValidPath(int[][] grid) {
    R = grid.length; 
    C = grid[0].length;

    vis = new boolean[R][C];
    vis[0][0] = true;
    Queue<Pos> q = new LinkedList<>();
    q.add(new Pos(0, 0));   

    while (!q.isEmpty()) {
        Pos cur = q.poll();
        if (cur.x == R-1 && cur.y == C-1)
            return true;
        //向左走
        if (grid[cur.x][cur.y] == 1 || grid[cur.x][cur.y] == 3 || grid[cur.x][cur.y] == 5) {
            int L = cur.y - 1;
            if (L >= 0 && !vis[cur.x][L] && (grid[cur.x][L] == 1 || grid[cur.x][L] == 4 || grid[cur.x][L] == 6)) {
                q.add(new Pos(cur.x, L));
                vis[cur.x][L] = true;
            }
        }
        //向右走
        if (grid[cur.x][cur.y] == 1 || grid[cur.x][cur.y] == 4 || grid[cur.x][cur.y] == 6) {
            int R = cur.y + 1;
            if (R < C && !vis[cur.x][R] && (grid[cur.x][R] == 1 || grid[cur.x][R] == 3 || grid[cur.x][R] == 5)) {
                q.add(new Pos(cur.x, R));
                vis[cur.x][R] = true;
            }
        }
        //向上走
        if (grid[cur.x][cur.y] == 2 || grid[cur.x][cur.y] == 5 || grid[cur.x][cur.y] == 6) {
            int U = cur.x - 1;
            if (U >= 0 && !vis[U][cur.y] && (grid[U][cur.y] == 2 || grid[U][cur.y] == 3 || grid[U][cur.y] == 4)) {
                q.add(new Pos(U, cur.y));
                vis[U][cur.y] = true;
            }
        }
        //向下走
        if (grid[cur.x][cur.y] == 2 || grid[cur.x][cur.y] == 3 || grid[cur.x][cur.y] == 4) {
            int D = cur.x + 1;
            if (D < R && !vis[D][cur.y] && (grid[D][cur.y] == 2 || grid[D][cur.y] == 5 || grid[D][cur.y] == 6)) {
                q.add(new Pos(D, cur.y));
                vis[D][cur.y] = true;
            }
        }
    }
    return false;
}

class Pos {
    int x, y;
    public Pos(int _x, int _y) {
        x = _x;
        y = _y;
    }
}

複雜度分析

  • 時間複雜度:O(R×C)O(R × C)
  • 空間複雜度:O(R×C)O(R × C)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章