一、題目描述
二、題解
方法一: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;
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,