Skip to content

Commit 2d329a3

Browse files
committed
feat: add solutions to lc problem: No.0934
No.0934.Shortest Bridge
1 parent 6ade429 commit 2d329a3

File tree

6 files changed

+616
-0
lines changed

6 files changed

+616
-0
lines changed

solution/0900-0999/0934.Shortest Bridge/README.md

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,232 @@
4747

4848
<!-- 这里可写通用的实现逻辑 -->
4949

50+
DFS & BFS。
51+
52+
先通过 DFS 将其中一个岛屿的所有 1 置为 2,并将这个岛屿所有坐标点放入队列中;然后通过 BFS 一层层向外扩散,直至碰到另一个岛屿。
53+
5054
<!-- tabs:start -->
5155

5256
### **Python3**
5357

5458
<!-- 这里可写当前语言的特殊实现逻辑 -->
5559

5660
```python
61+
class Solution:
62+
def shortestBridge(self, grid: List[List[int]]) -> int:
63+
def find():
64+
for i in range(m):
65+
for j in range(n):
66+
if grid[i][j] == 1:
67+
return i, j
5768

69+
def dfs(i, j):
70+
q.append((i, j))
71+
grid[i][j] = 2
72+
for a, b in dirs:
73+
x, y = i + a, j + b
74+
if 0 <= x < m and 0 <= y < n and grid[x][y] == 1:
75+
dfs(x, y)
76+
77+
m, n = len(grid), len(grid[0])
78+
q = deque()
79+
dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]
80+
i, j = find()
81+
dfs(i, j)
82+
ans = -1
83+
while q:
84+
ans += 1
85+
for _ in range(len(q), 0, -1):
86+
i, j = q.popleft()
87+
for a, b in dirs:
88+
x, y = i + a, j + b
89+
if 0 <= x < m and 0 <= y < n:
90+
if grid[x][y] == 1:
91+
return ans
92+
if grid[x][y] == 0:
93+
grid[x][y] = 2
94+
q.append((x, y))
95+
return 0
5896
```
5997

6098
### **Java**
6199

62100
<!-- 这里可写当前语言的特殊实现逻辑 -->
63101

64102
```java
103+
class Solution {
104+
private int[][] grid;
105+
private int[] dirs = {-1, 0, 1, 0, -1};
106+
private int m;
107+
private int n;
108+
109+
public int shortestBridge(int[][] grid) {
110+
m = grid.length;
111+
n = grid[0].length;
112+
this.grid = grid;
113+
int[] start = find();
114+
Queue<int[]> q = new LinkedList<>();
115+
dfs(start[0], start[1], q);
116+
int ans = -1;
117+
while (!q.isEmpty()) {
118+
++ans;
119+
for (int k = q.size(); k > 0; --k) {
120+
int[] p = q.poll();
121+
for (int i = 0; i < 4; ++i) {
122+
int x = p[0] + dirs[i];
123+
int y = p[1] + dirs[i + 1];
124+
if (x >= 0 && x < m && y >= 0 && y < n) {
125+
if (grid[x][y] == 1) {
126+
return ans;
127+
}
128+
if (grid[x][y] == 0) {
129+
grid[x][y] = 2;
130+
q.offer(new int[]{x, y});
131+
}
132+
}
133+
}
134+
}
135+
}
136+
return 0;
137+
}
138+
139+
private void dfs(int i, int j, Queue<int[]> q) {
140+
grid[i][j] = 2;
141+
q.offer(new int[]{i, j});
142+
for (int k = 0; k < 4; ++k) {
143+
int x = i + dirs[k];
144+
int y = j + dirs[k + 1];
145+
if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1) {
146+
dfs(x, y, q);
147+
}
148+
}
149+
}
150+
151+
private int[] find() {
152+
for (int i = 0; i < m; ++i) {
153+
for (int j = 0; j < n; ++j) {
154+
if (grid[i][j] == 1) {
155+
return new int[]{i, j};
156+
}
157+
}
158+
}
159+
return new int[]{0, 0};
160+
}
161+
}
162+
```
163+
164+
### **C++**
165+
166+
```cpp
167+
class Solution {
168+
public:
169+
vector<int> dirs = {-1, 0, 1, 0, -1};
170+
171+
int shortestBridge(vector<vector<int>>& grid) {
172+
vector<int> start = find(grid);
173+
queue<vector<int>> q;
174+
dfs(start[0], start[1], q, grid);
175+
int ans = -1;
176+
while (!q.empty())
177+
{
178+
++ans;
179+
for (int k = q.size(); k > 0; --k)
180+
{
181+
auto p = q.front();
182+
q.pop();
183+
for (int i = 0; i < 4; ++i)
184+
{
185+
int x = p[0] + dirs[i];
186+
int y = p[1] + dirs[i + 1];
187+
if (x >= 0 && x < grid.size() && y >= 0 && y < grid[0].size())
188+
{
189+
if (grid[x][y] == 1) return ans;
190+
if (grid[x][y] == 0)
191+
{
192+
grid[x][y] = 2;
193+
q.push({x, y});
194+
}
195+
}
196+
}
197+
}
198+
}
199+
return 0;
200+
}
201+
202+
void dfs(int i, int j, queue<vector<int>>& q, vector<vector<int>>& grid) {
203+
grid[i][j] = 2;
204+
q.push({i, j});
205+
for (int k = 0; k < 4; ++k)
206+
{
207+
int x = i + dirs[k];
208+
int y = j + dirs[k + 1];
209+
if (x >= 0 && x < grid.size() && y >= 0 && y < grid[0].size() && grid[x][y] == 1)
210+
dfs(x, y, q, grid);
211+
}
212+
}
213+
214+
vector<int> find(vector<vector<int>>& grid) {
215+
for (int i = 0; i < grid.size(); ++i)
216+
for (int j = 0; j < grid[0].size(); ++j)
217+
if (grid[i][j] == 1)
218+
return {i, j};
219+
return {0, 0};
220+
}
221+
};
222+
```
223+
224+
### **Go**
65225
226+
```go
227+
func shortestBridge(grid [][]int) int {
228+
m, n := len(grid), len(grid[0])
229+
find := func() []int {
230+
for i := 0; i < m; i++ {
231+
for j := 0; j < n; j++ {
232+
if grid[i][j] == 1 {
233+
return []int{i, j}
234+
}
235+
}
236+
}
237+
return []int{0, 0}
238+
}
239+
start := find()
240+
var q [][]int
241+
dirs := []int{-1, 0, 1, 0, -1}
242+
var dfs func(i, j int)
243+
dfs = func(i, j int) {
244+
grid[i][j] = 2
245+
q = append(q, []int{i, j})
246+
for k := 0; k < 4; k++ {
247+
x, y := i+dirs[k], j+dirs[k+1]
248+
if x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 {
249+
dfs(x, y)
250+
}
251+
}
252+
}
253+
dfs(start[0], start[1])
254+
ans := -1
255+
for len(q) > 0 {
256+
ans++
257+
for k := len(q); k > 0; k-- {
258+
p := q[0]
259+
q = q[1:]
260+
for i := 0; i < 4; i++ {
261+
x, y := p[0]+dirs[i], p[1]+dirs[i+1]
262+
if x >= 0 && x < m && y >= 0 && y < n {
263+
if grid[x][y] == 1 {
264+
return ans
265+
}
266+
if grid[x][y] == 0 {
267+
grid[x][y] = 2
268+
q = append(q, []int{x, y})
269+
}
270+
}
271+
}
272+
}
273+
}
274+
return 0
275+
}
66276
```
67277

68278
### **...**

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy