Skip to content

Commit 79751f9

Browse files
Sync LeetCode submission Runtime - 20 ms (73.28%), Memory - 65.6 MB (30.77%)
1 parent 9fc9d1c commit 79751f9

2 files changed

Lines changed: 106 additions & 0 deletions

File tree

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<p>You are given an <code>m x n</code> <code>grid</code>. Each cell of <code>grid</code> represents a street. The street of <code>grid[i][j]</code> can be:</p>
2+
3+
<ul>
4+
<li><code>1</code> which means a street connecting the left cell and the right cell.</li>
5+
<li><code>2</code> which means a street connecting the upper cell and the lower cell.</li>
6+
<li><code>3</code> which means a street connecting the left cell and the lower cell.</li>
7+
<li><code>4</code> which means a street connecting the right cell and the lower cell.</li>
8+
<li><code>5</code> which means a street connecting the left cell and the upper cell.</li>
9+
<li><code>6</code> which means a street connecting the right cell and the upper cell.</li>
10+
</ul>
11+
<img alt="" src="https://assets.leetcode.com/uploads/2020/03/05/main.png" style="width: 450px; height: 708px;" />
12+
<p>You will initially start at the street of the upper-left cell <code>(0, 0)</code>. A valid path in the grid is a path that starts from the upper left cell <code>(0, 0)</code> and ends at the bottom-right cell <code>(m - 1, n - 1)</code>. <strong>The path should only follow the streets</strong>.</p>
13+
14+
<p><strong>Notice</strong> that you are <strong>not allowed</strong> to change any street.</p>
15+
16+
<p>Return <code>true</code><em> if there is a valid path in the grid or </em><code>false</code><em> otherwise</em>.</p>
17+
18+
<p>&nbsp;</p>
19+
<p><strong class="example">Example 1:</strong></p>
20+
<img alt="" src="https://assets.leetcode.com/uploads/2020/03/05/e1.png" style="width: 455px; height: 311px;" />
21+
<pre>
22+
<strong>Input:</strong> grid = [[2,4,3],[6,5,2]]
23+
<strong>Output:</strong> true
24+
<strong>Explanation:</strong> As shown you can start at cell (0, 0) and visit all the cells of the grid to reach (m - 1, n - 1).
25+
</pre>
26+
27+
<p><strong class="example">Example 2:</strong></p>
28+
<img alt="" src="https://assets.leetcode.com/uploads/2020/03/05/e2.png" style="width: 455px; height: 293px;" />
29+
<pre>
30+
<strong>Input:</strong> grid = [[1,2,1],[1,2,1]]
31+
<strong>Output:</strong> false
32+
<strong>Explanation:</strong> As shown you the street at cell (0, 0) is not connected with any street of any other cell and you will get stuck at cell (0, 0)
33+
</pre>
34+
35+
<p><strong class="example">Example 3:</strong></p>
36+
37+
<pre>
38+
<strong>Input:</strong> grid = [[1,1,2]]
39+
<strong>Output:</strong> false
40+
<strong>Explanation:</strong> You will get stuck at cell (0, 1) and you cannot reach cell (0, 2).
41+
</pre>
42+
43+
<p>&nbsp;</p>
44+
<p><strong>Constraints:</strong></p>
45+
46+
<ul>
47+
<li><code>m == grid.length</code></li>
48+
<li><code>n == grid[i].length</code></li>
49+
<li><code>1 &lt;= m, n &lt;= 300</code></li>
50+
<li><code>1 &lt;= grid[i][j] &lt;= 6</code></li>
51+
</ul>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
class Solution {
2+
vector<int> dx = {-1, 1, 0, 0};
3+
vector<int> dy = {0, 0, -1, 1};
4+
vector<vector<int>> vis;
5+
6+
bool dfs(int x, int y, vector<vector<int>>& grid, vector<vector<bool>>& visited) {
7+
int n = grid.size();
8+
int m = grid[0].size();
9+
10+
if (x == n - 1 && y == m - 1) return true;
11+
12+
visited[x][y] = true;
13+
int val = grid[x][y];
14+
15+
for (int i = 0; i < 4; i++) {
16+
int nx = x + dx[i];
17+
int ny = y + dy[i];
18+
19+
if (nx < 0 || nx >= n || ny < 0 || ny >= m || visited[nx][ny]) continue;
20+
21+
int newVal = grid[nx][ny];
22+
23+
if (i == 0) {
24+
if ((val == 2 || val == 5 || val == 6) && (newVal == 2 || newVal == 3 || newVal == 4)) {
25+
if (dfs(nx, ny, grid, visited)) return true;
26+
}
27+
}
28+
else if (i == 1) {
29+
if ((val == 2 || val == 3 || val == 4) && (newVal == 2 || newVal == 5 || newVal == 6)) {
30+
if (dfs(nx, ny, grid, visited)) return true;
31+
}
32+
}
33+
else if (i == 2) {
34+
if ((val == 1 || val == 3 || val == 5) && (newVal == 1 || newVal == 4 || newVal == 6)) {
35+
if (dfs(nx, ny, grid, visited)) return true;
36+
}
37+
}
38+
else if (i == 3) {
39+
if ((val == 1 || val == 4 || val == 6) && (newVal == 1 || newVal == 3 || newVal == 5)) {
40+
if (dfs(nx, ny, grid, visited)) return true;
41+
}
42+
}
43+
}
44+
45+
return false;
46+
}
47+
48+
public:
49+
bool hasValidPath(vector<vector<int>>& grid) {
50+
int n = grid.size();
51+
int m = grid[0].size();
52+
vector<vector<bool>> visited(n, vector<bool>(m, false));
53+
return dfs(0, 0, grid, visited);
54+
}
55+
};

0 commit comments

Comments
 (0)