Skip to content

Commit 83213ff

Browse files
authored
Add solution for leetcode's surround-region
1 parent 3be495c commit 83213ff

File tree

1 file changed

+130
-0
lines changed

1 file changed

+130
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import java.util.HashSet;
2+
import java.util.Set;
3+
4+
5+
/*
6+
input
7+
[ ['O','O','O','O','X','X'],
8+
['O','O','O','O','O','O'],
9+
['O','X','O','X','O','O'],
10+
['O','X','O','O','X','O'],
11+
['O','X','O','X','O','O'],
12+
['O','X','O','O','O','O']
13+
]
14+
15+
16+
mine output
17+
[ ['O','O','O','O','X','X'],
18+
['O','O','O','O','O','O'],
19+
['O','X','X','X','X','O'],
20+
['O','X','X','X','X','O'],
21+
['O','X','X','X','X','O'],
22+
['O','X','O','O','O','O']
23+
]
24+
25+
expected
26+
[ ['O','O','O','O','X','X'],
27+
['O','O','O','O','O','O'],
28+
['O','X','O','X','O','O'],
29+
['O','X','O','O','X','O'],
30+
['O','X','O','X','O','O'],
31+
['O','X','O','O','O','O']
32+
]
33+
*/
34+
35+
36+
class Solution {
37+
public static void main(String[] s) {
38+
char board[][] = {{'O', 'O', 'O', 'O', 'X', 'X'},
39+
{'O', 'O', 'O', 'O', 'O', 'O'},
40+
{'O', 'X', 'O', 'X', 'O', 'O'},
41+
{'O', 'X', 'O', 'O', 'X', 'O'},
42+
{'O', 'X', 'O', 'X', 'O', 'O'},
43+
{'O', 'X', 'O', 'O', 'O', 'O'}};
44+
45+
for (int i = 0; i < board.length; i++) {
46+
for (int j = 0; j < board[0].length; j++) {
47+
if (i == 0 || i == (board.length - 1) || j == 0 || j == (board[0].length - 1)) {
48+
if (board[i][j] == 'O') {
49+
makeBoundaryZerosToOne(board, i, j, new HashSet<>(), new HashSet<>());
50+
}
51+
}
52+
}
53+
}
54+
55+
for (int i = 0; i < board.length; i++) {
56+
for (int j = 0; j < board[0].length; j++) {
57+
if (board[i][j] == 'O') {
58+
board[i][j] = 'X';
59+
}
60+
}
61+
}
62+
63+
for (int i = 0; i < board.length; i++) {
64+
for (int j = 0; j < board[0].length; j++) {
65+
if (board[i][j] == '1') {
66+
board[i][j] = 'O';
67+
}
68+
}
69+
}
70+
71+
for (int i = 0; i < board.length; i++) {
72+
for (int j = 0; j < board[0].length; j++) {
73+
System.out.print(board[i][j]+" ");
74+
}
75+
System.out.println("");
76+
}
77+
}
78+
79+
private static void makeBoundaryZerosToOne(char[][] board, int i, int j,
80+
Set<Integer> visitedI, Set<Integer> visitedJ) {
81+
if (i == 2 && j == 2) {
82+
System.out.println("debug");
83+
}
84+
85+
if (isNotInRange(board, i, j))
86+
return;
87+
88+
if (visitedI.contains((i+1) * 100000) && visitedJ.contains(j))
89+
return;
90+
91+
board[i][j] = '1';
92+
visitedI.add((i+1) * 100000);
93+
visitedJ.add(j);
94+
95+
if (!isNotInRange(board, i + 1, j) && board[i + 1][j] == 'O') {
96+
makeBoundaryZerosToOne(board, i + 1, j, visitedI, visitedJ);
97+
}
98+
if (!isNotInRange(board, i, j + 1) && board[i][j + 1] == 'O') {
99+
makeBoundaryZerosToOne(board, i, j + 1, visitedI, visitedJ);
100+
}
101+
if (!isNotInRange(board, i, j - 1) && board[i][j - 1] == 'O') {
102+
makeBoundaryZerosToOne(board, i, j - 1, visitedI, visitedJ);
103+
}
104+
if (!isNotInRange(board, i - 1, j) && board[i - 1][j] == 'O') {
105+
makeBoundaryZerosToOne(board, i - 1, j, visitedI, visitedJ);
106+
}
107+
}
108+
109+
private static boolean isNotInRange(char[][] board, int i, int j) {
110+
return i < 0 || j < 0 || i >= board.length || j >= board[0].length;
111+
}
112+
113+
private class cell {
114+
private int i;
115+
private int j;
116+
117+
public cell(int i, int j) {
118+
this.i = i;
119+
this.j = j;
120+
}
121+
122+
public int getI() {
123+
return i;
124+
}
125+
126+
public int getJ() {
127+
return j;
128+
}
129+
}
130+
}

0 commit comments

Comments
 (0)