Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4a331cb

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

File tree

13 files changed

+602
-632
lines changed

13 files changed

+602
-632
lines changed

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

Lines changed: 203 additions & 208 deletions
Large diffs are not rendered by default.

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

Lines changed: 203 additions & 208 deletions
Large diffs are not rendered by default.

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

Lines changed: 24 additions & 19 deletions
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
};
Lines changed: 40 additions & 59 deletions
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‎

Lines changed: 15 additions & 14 deletions
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
}
Lines changed: 11 additions & 11 deletions
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
}
Lines changed: 15 additions & 19 deletions
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-
forjinrange(n):
17-
ifboard[i][j] =='O'and (
18-
i==0ori==m-1orj==0orj==n-1
19-
):
20-
dfs(i, j)
12+
dfs(i, 0)
13+
dfs(i, n-1)
14+
forjinrange(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‎

Lines changed: 35 additions & 28 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /