Skip to content

Commit 4a331cb

Browse files
authored
feat: add solutions to lc problem: No.0130 (doocs#2281)
No.0130.Surrounded Regions
1 parent e53f9e7 commit 4a331cb

13 files changed

+602
-632
lines changed

solution/0100-0199/0130.Surrounded Regions/README.md

+203-208
Large diffs are not rendered by default.

solution/0100-0199/0130.Surrounded Regions/README_EN.md

+203-208
Large diffs are not rendered by default.

solution/0100-0199/0130.Surrounded Regions/Solution.cpp

+24-19
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,32 @@ class Solution {
22
public:
33
void solve(vector<vector<char>>& board) {
44
int m = board.size(), n = board[0].size();
5-
for (int i = 0; i < m; ++i)
6-
for (int j = 0; j < n; ++j)
7-
if ((i == 0 || i == m - 1 || j == 0 || j == n - 1) && board[i][j] == 'O')
8-
dfs(board, i, j);
9-
for (int i = 0; i < m; ++i) {
10-
for (int j = 0; j < n; ++j) {
11-
if (board[i][j] == '.')
12-
board[i][j] = 'O';
13-
else if (board[i][j] == 'O')
14-
board[i][j] = 'X';
5+
int dirs[5] = {-1, 0, 1, 0, -1};
6+
function<void(int, int)> dfs = [&](int i, int j) {
7+
if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != 'O') {
8+
return;
9+
}
10+
board[i][j] = '.';
11+
for (int k = 0; k < 4; ++k) {
12+
dfs(i + dirs[k], j + dirs[k + 1]);
1513
}
14+
};
15+
for (int i = 0; i < m; ++i) {
16+
dfs(i, 0);
17+
dfs(i, n - 1);
1618
}
17-
}
18-
19-
void dfs(vector<vector<char>>& board, int i, int j) {
20-
board[i][j] = '.';
21-
vector<int> dirs = {-1, 0, 1, 0, -1};
22-
for (int k = 0; k < 4; ++k) {
23-
int x = i + dirs[k], y = j + dirs[k + 1];
24-
if (x >= 0 && x < board.size() && y >= 0 && y < board[0].size() && board[x][y] == 'O')
25-
dfs(board, x, y);
19+
for (int j = 1; j < n - 1; ++j) {
20+
dfs(0, j);
21+
dfs(m - 1, j);
22+
}
23+
for (auto& row : board) {
24+
for (auto& c : row) {
25+
if (c == '.') {
26+
c = 'O';
27+
} else if (c == 'O') {
28+
c = 'X';
29+
}
30+
}
2631
}
2732
}
2833
};
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,41 @@
1-
using System;
2-
using System.Collections.Generic;
3-
4-
public class Solution {
5-
private static readonly int[,] directions = new int[4, 2] { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }};
6-
public void Solve(char[][] board) {
7-
var lenI = board.Length;
8-
var lenJ = lenI == 0 ? 0 : board[0].Length;
9-
10-
for (var i = 0; i < lenI; ++i)
11-
{
12-
for (var j = 0; j < lenJ; ++j)
13-
{
14-
if (board[i][j] == 'O')
15-
{
16-
var marked = new List<Tuple<int, int>>();
17-
marked.Add(Tuple.Create(i, j));
18-
board[i][j] = 'M';
19-
bool escaped = false;
20-
for (var m = 0; m < marked.Count; ++m)
21-
{
22-
for (var k = 0; k < 4; ++k)
23-
{
24-
var newI = marked[m].Item1 + directions[k, 0];
25-
var newJ = marked[m].Item2 + directions[k, 1];
26-
if (newI < 0 || newI >= lenI || newJ < 0 || newJ >= lenJ)
27-
{
28-
escaped = true;
29-
}
30-
else if (board[newI][newJ] == 'O')
31-
{
32-
board[newI][newJ] = 'M';
33-
marked.Add(Tuple.Create(newI, newJ));
34-
}
35-
}
36-
}
37-
38-
if (!escaped)
39-
{
40-
foreach (var item in marked)
41-
{
42-
board[item.Item1][item.Item2] = 'X';
43-
}
44-
}
45-
}
46-
}
47-
}
48-
49-
for (var i = 0; i < lenI; ++i)
50-
{
51-
for (var j = 0; j < lenJ; ++j)
52-
{
53-
if (board[i][j] == 'M')
54-
{
55-
board[i][j] = 'O';
56-
}
57-
}
58-
}
59-
}
1+
public class Solution {
2+
private readonly int[] dirs = {-1, 0, 1, 0, -1};
3+
private char[][] board;
4+
private int m;
5+
private int n;
6+
7+
public void Solve(char[][] board) {
8+
m = board.Length;
9+
n = board[0].Length;
10+
this.board = board;
11+
12+
for (int i = 0; i < m; ++i) {
13+
Dfs(i, 0);
14+
Dfs(i, n - 1);
15+
}
16+
for (int j = 0; j < n; ++j) {
17+
Dfs(0, j);
18+
Dfs(m - 1, j);
19+
}
20+
21+
for (int i = 0; i < m; ++i) {
22+
for (int j = 0; j < n; ++j) {
23+
if (board[i][j] == '.') {
24+
board[i][j] = 'O';
25+
} else if (board[i][j] == 'O') {
26+
board[i][j] = 'X';
27+
}
28+
}
29+
}
30+
}
31+
32+
private void Dfs(int i, int j) {
33+
if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != 'O') {
34+
return;
35+
}
36+
board[i][j] = '.';
37+
for (int k = 0; k < 4; ++k) {
38+
Dfs(i + dirs[k], j + dirs[k + 1]);
39+
}
40+
}
6041
}

solution/0100-0199/0130.Surrounded Regions/Solution.go

+15-14
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
11
func solve(board [][]byte) {
22
m, n := len(board), len(board[0])
3+
dirs := [5]int{-1, 0, 1, 0, -1}
34
var dfs func(i, j int)
45
dfs = func(i, j int) {
6+
if i < 0 || i >= m || j < 0 || j >= n || board[i][j] != 'O' {
7+
return
8+
}
59
board[i][j] = '.'
6-
dirs := []int{-1, 0, 1, 0, -1}
710
for k := 0; k < 4; k++ {
8-
x, y := i+dirs[k], j+dirs[k+1]
9-
if x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O' {
10-
dfs(x, y)
11-
}
11+
dfs(i+dirs[k], j+dirs[k+1])
1212
}
1313
}
1414
for i := 0; i < m; i++ {
15-
for j := 0; j < n; j++ {
16-
if (i == 0 || i == m-1 || j == 0 || j == n-1) && board[i][j] == 'O' {
17-
dfs(i, j)
18-
}
19-
}
15+
dfs(i, 0)
16+
dfs(i, n-1)
2017
}
21-
for i := 0; i < m; i++ {
22-
for j := 0; j < n; j++ {
23-
if board[i][j] == '.' {
18+
for j := 0; j < n; j++ {
19+
dfs(0, j)
20+
dfs(m-1, j)
21+
}
22+
for i, row := range board {
23+
for j, c := range row {
24+
if c == '.' {
2425
board[i][j] = 'O'
25-
} else if board[i][j] == 'O' {
26+
} else if c == 'O' {
2627
board[i][j] = 'X'
2728
}
2829
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
class Solution {
2+
private final int[] dirs = {-1, 0, 1, 0, -1};
23
private char[][] board;
34
private int m;
45
private int n;
@@ -8,11 +9,12 @@ public void solve(char[][] board) {
89
n = board[0].length;
910
this.board = board;
1011
for (int i = 0; i < m; ++i) {
11-
for (int j = 0; j < n; ++j) {
12-
if ((i == 0 || i == m - 1 || j == 0 || j == n - 1) && board[i][j] == 'O') {
13-
dfs(i, j);
14-
}
15-
}
12+
dfs(i, 0);
13+
dfs(i, n - 1);
14+
}
15+
for (int j = 0; j < n; ++j) {
16+
dfs(0, j);
17+
dfs(m - 1, j);
1618
}
1719
for (int i = 0; i < m; ++i) {
1820
for (int j = 0; j < n; ++j) {
@@ -26,14 +28,12 @@ public void solve(char[][] board) {
2628
}
2729

2830
private void dfs(int i, int j) {
31+
if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != 'O') {
32+
return;
33+
}
2934
board[i][j] = '.';
30-
int[] dirs = {-1, 0, 1, 0, -1};
3135
for (int k = 0; k < 4; ++k) {
32-
int x = i + dirs[k];
33-
int y = j + dirs[k + 1];
34-
if (x >= 0 && x < m && y >= 0 && y < n && board[x][y] == 'O') {
35-
dfs(x, y);
36-
}
36+
dfs(i + dirs[k], j + dirs[k + 1]);
3737
}
3838
}
3939
}
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,22 @@
11
class Solution:
22
def solve(self, board: List[List[str]]) -> None:
3-
"""
4-
Do not return anything, modify board in-place instead.
5-
"""
6-
7-
def dfs(i, j):
8-
board[i][j] = '.'
9-
for a, b in [[0, -1], [0, 1], [1, 0], [-1, 0]]:
10-
x, y = i + a, j + b
11-
if 0 <= x < m and 0 <= y < n and board[x][y] == 'O':
12-
dfs(x, y)
3+
def dfs(i: int, j: int):
4+
if not (0 <= i < m and 0 <= j < n and board[i][j] == "O"):
5+
return
6+
board[i][j] = "."
7+
for a, b in pairwise((-1, 0, 1, 0, -1)):
8+
dfs(i + a, j + b)
139

1410
m, n = len(board), len(board[0])
1511
for i in range(m):
16-
for j in range(n):
17-
if board[i][j] == 'O' and (
18-
i == 0 or i == m - 1 or j == 0 or j == n - 1
19-
):
20-
dfs(i, j)
12+
dfs(i, 0)
13+
dfs(i, n - 1)
14+
for j in range(n):
15+
dfs(0, j)
16+
dfs(m - 1, j)
2117
for i in range(m):
2218
for j in range(n):
23-
if board[i][j] == 'O':
24-
board[i][j] = 'X'
25-
elif board[i][j] == '.':
26-
board[i][j] = 'O'
19+
if board[i][j] == ".":
20+
board[i][j] = "O"
21+
elif board[i][j] == "O":
22+
board[i][j] = "X"

solution/0100-0199/0130.Surrounded Regions/Solution.rs

+35-28
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,48 @@
11
impl Solution {
2-
fn dfs(i: usize, j: usize, mark: char, vis: &mut Vec<Vec<bool>>, board: &mut Vec<Vec<char>>) {
3-
if vis[i][j] || board[i][j] != mark {
4-
return;
5-
}
6-
vis[i][j] = true;
7-
if i > 0 {
8-
Self::dfs(i - 1, j, mark, vis, board);
9-
}
10-
if i < vis.len() - 1 {
11-
Self::dfs(i + 1, j, mark, vis, board);
12-
}
13-
if j > 0 {
14-
Self::dfs(i, j - 1, mark, vis, board);
15-
}
16-
if j < vis[0].len() - 1 {
17-
Self::dfs(i, j + 1, mark, vis, board);
18-
}
19-
}
20-
212
pub fn solve(board: &mut Vec<Vec<char>>) {
223
let m = board.len();
234
let n = board[0].len();
24-
let mut vis = vec![vec![false; n]; m];
5+
let dirs = vec![-1, 0, 1, 0, -1];
6+
7+
fn dfs(
8+
board: &mut Vec<Vec<char>>,
9+
i: usize,
10+
j: usize,
11+
dirs: &Vec<i32>,
12+
m: usize,
13+
n: usize
14+
) {
15+
if i >= 0 && i < m && j >= 0 && j < n && board[i][j] == 'O' {
16+
board[i][j] = '.';
17+
for k in 0..4 {
18+
dfs(
19+
board,
20+
((i as i32) + dirs[k]) as usize,
21+
((j as i32) + dirs[k + 1]) as usize,
22+
dirs,
23+
m,
24+
n
25+
);
26+
}
27+
}
28+
}
29+
2530
for i in 0..m {
26-
Self::dfs(i, 0, board[i][0], &mut vis, board);
27-
Self::dfs(i, n - 1, board[i][n - 1], &mut vis, board);
31+
dfs(board, i, 0, &dirs, m, n);
32+
dfs(board, i, n - 1, &dirs, m, n);
2833
}
29-
for i in 0..n {
30-
Self::dfs(0, i, board[0][i], &mut vis, board);
31-
Self::dfs(m - 1, i, board[m - 1][i], &mut vis, board);
34+
for j in 0..n {
35+
dfs(board, 0, j, &dirs, m, n);
36+
dfs(board, m - 1, j, &dirs, m, n);
3237
}
38+
3339
for i in 0..m {
3440
for j in 0..n {
35-
if vis[i][j] {
36-
continue;
41+
if board[i][j] == '.' {
42+
board[i][j] = 'O';
43+
} else if board[i][j] == 'O' {
44+
board[i][j] = 'X';
3745
}
38-
board[i][j] = 'X';
3946
}
4047
}
4148
}

0 commit comments

Comments
 (0)