@@ -84,7 +84,221 @@ public:
8484
8585## 其他语言版本
8686
87+ ### Java
88+
89+ ``` Java
90+ // 广度优先遍历
91+ // 使用 visited 数组进行标记
92+ class Solution {
93+ private static final int [][] position = {{- 1 , 0 }, {0 , 1 }, {1 , 0 }, {0 , - 1 }}; // 四个方向
94+
95+ public void solve (char [][] board ) {
96+ // rowSize:行的长度,colSize:列的长度
97+ int rowSize = board. length, colSize = board[0 ]. length;
98+ boolean [][] visited = new boolean [rowSize][colSize];
99+ Queue<int[]> queue = new ArrayDeque<> ();
100+ // 从左侧边,和右侧边遍历
101+ for (int row = 0 ; row < rowSize; row++ ) {
102+ if (board[row][0 ] == ' O' ) {
103+ visited[row][0 ] = true ;
104+ queue. add(new int []{row, 0 });
105+ }
106+ if (board[row][colSize - 1 ] == ' O' ) {
107+ visited[row][colSize - 1 ] = true ;
108+ queue. add(new int []{row, colSize - 1 });
109+ }
110+ }
111+ // 从上边和下边遍历,在对左侧边和右侧边遍历时我们已经遍历了矩阵的四个角
112+ // 所以在遍历上边和下边时可以不用遍历四个角
113+ for (int col = 1 ; col < colSize - 1 ; col++ ) {
114+ if (board[0 ][col] == ' O' ) {
115+ visited[0 ][col] = true ;
116+ queue. add(new int []{0 , col});
117+ }
118+ if (board[rowSize - 1 ][col] == ' O' ) {
119+ visited[rowSize - 1 ][col] = true ;
120+ queue. add(new int []{rowSize - 1 , col});
121+ }
122+ }
123+ // 广度优先遍历,把没有被 'X' 包围的 'O' 进行标记
124+ while (! queue. isEmpty()) {
125+ int [] current = queue. poll();
126+ for (int [] pos: position) {
127+ int row = current[0 ] + pos[0 ], col = current[1 ] + pos[1 ];
128+ // 如果范围越界、位置已被访问过、该位置的值不是 'O',就直接跳过
129+ if (row < 0 || row >= rowSize || col < 0 || col >= colSize) continue ;
130+ if (visited[row][col] || board[row][col] != ' O' ) continue ;
131+ visited[row][col] = true ;
132+ queue. add(new int []{row, col});
133+ }
134+ }
135+ // 遍历数组,把没有被标记的 'O' 修改成 'X'
136+ for (int row = 0 ; row < rowSize; row++ ) {
137+ for (int col = 0 ; col < colSize; col++ ) {
138+ if (board[row][col] == ' O' && ! visited[row][col]) board[row][col] = ' X' ;
139+ }
140+ }
141+ }
142+ }
143+ ```
144+ ``` Java
145+ // 广度优先遍历
146+ // 直接修改 board 的值为其他特殊值
147+ class Solution {
148+ private static final int [][] position = {{- 1 , 0 }, {0 , 1 }, {1 , 0 }, {0 , - 1 }}; // 四个方向
149+
150+ public void solve (char [][] board ) {
151+ // rowSize:行的长度,colSize:列的长度
152+ int rowSize = board. length, colSize = board[0 ]. length;
153+ Queue<int[]> queue = new ArrayDeque<> ();
154+ // 从左侧边,和右侧边遍历
155+ for (int row = 0 ; row < rowSize; row++ ) {
156+ if (board[row][0 ] == ' O' )
157+ queue. add(new int []{row, 0 });
158+ if (board[row][colSize - 1 ] == ' O' )
159+ queue. add(new int []{row, colSize - 1 });
160+ }
161+ // 从上边和下边遍历,在对左侧边和右侧边遍历时我们已经遍历了矩阵的四个角
162+ // 所以在遍历上边和下边时可以不用遍历四个角
163+ for (int col = 1 ; col < colSize - 1 ; col++ ) {
164+ if (board[0 ][col] == ' O' )
165+ queue. add(new int []{0 , col});
166+ if (board[rowSize - 1 ][col] == ' O' )
167+ queue. add(new int []{rowSize - 1 , col});
168+ }
169+ // 广度优先遍历,把没有被 'X' 包围的 'O' 修改成特殊值
170+ while (! queue. isEmpty()) {
171+ int [] current = queue. poll();
172+ board[current[0 ]][current[1 ]] = ' A' ;
173+ for (int [] pos: position) {
174+ int row = current[0 ] + pos[0 ], col = current[1 ] + pos[1 ];
175+ // 如果范围越界、该位置的值不是 'O',就直接跳过
176+ if (row < 0 || row >= rowSize || col < 0 || col >= colSize) continue ;
177+ if (board[row][col] != ' O' ) continue ;
178+ queue. add(new int []{row, col});
179+ }
180+ }
181+ // 遍历数组,把 'O' 修改成 'X',特殊值修改成 'O'
182+ for (int row = 0 ; row < rowSize; row++ ) {
183+ for (int col = 0 ; col < colSize; col++ ) {
184+ if (board[row][col] == ' A' ) board[row][col] = ' O' ;
185+ else if (board[row][col] == ' O' ) board[row][col] = ' X' ;
186+ }
187+ }
188+ }
189+ }
190+ ```
191+ ``` Java
192+ // 深度优先遍历
193+ // 使用 visited 数组进行标记
194+ class Solution {
195+ private static final int [][] position = {{- 1 , 0 }, {0 , 1 }, {1 , 0 }, {0 , - 1 }}; // 四个方向
196+
197+ public void dfs (char [][] board , int row , int col , boolean [][] visited ) {
198+ for (int [] pos: position) {
199+ int nextRow = row + pos[0 ], nextCol = col + pos[1 ];
200+ // 位置越界
201+ if (nextRow < 0 || nextRow >= board. length || nextCol < 0 || nextCol >= board[0 ]. length)
202+ continue ;
203+ // 位置已被访问过、新位置值不是 'O'
204+ if (visited[nextRow][nextCol] || board[nextRow][nextCol] != ' O' ) continue ;
205+ visited[nextRow][nextCol] = true ;
206+ dfs(board, nextRow, nextCol, visited);
207+ }
208+ }
209+
210+ public void solve (char [][] board ) {
211+ int rowSize = board. length, colSize = board[0 ]. length;
212+ boolean [][] visited = new boolean [rowSize][colSize];
213+ // 从左侧遍、右侧遍遍历
214+ for (int row = 0 ; row < rowSize; row++ ) {
215+ if (board[row][0 ] == ' O' && ! visited[row][0 ]) {
216+ visited[row][0 ] = true ;
217+ dfs(board, row, 0 , visited);
218+ }
219+ if (board[row][colSize - 1 ] == ' O' && ! visited[row][colSize - 1 ]) {
220+ visited[row][colSize - 1 ] = true ;
221+ dfs(board, row, colSize - 1 , visited);
222+ }
223+ }
224+ // 从上边和下边遍历,在对左侧边和右侧边遍历时我们已经遍历了矩阵的四个角
225+ // 所以在遍历上边和下边时可以不用遍历四个角
226+ for (int col = 1 ; col < colSize - 1 ; col++ ) {
227+ if (board[0 ][col] == ' O' && ! visited[0 ][col]) {
228+ visited[0 ][col] = true ;
229+ dfs(board, 0 , col, visited);
230+ }
231+ if (board[rowSize - 1 ][col] == ' O' && ! visited[rowSize - 1 ][col]) {
232+ visited[rowSize - 1 ][col] = true ;
233+ dfs(board, rowSize - 1 , col, visited);
234+ }
235+ }
236+ // 遍历数组,把没有被标记的 'O' 修改成 'X'
237+ for (int row = 0 ; row < rowSize; row++ ) {
238+ for (int col = 0 ; col < colSize; col++ ) {
239+ if (board[row][col] == ' O' && ! visited[row][col]) board[row][col] = ' X' ;
240+ }
241+ }
242+ }
243+ }
244+ ```
245+ ``` Java
246+ // 深度优先遍历
247+ // // 直接修改 board 的值为其他特殊值
248+ class Solution {
249+ private static final int [][] position = {{- 1 , 0 }, {0 , 1 }, {1 , 0 }, {0 , - 1 }}; // 四个方向
250+
251+ public void dfs (char [][] board , int row , int col ) {
252+ for (int [] pos: position) {
253+ int nextRow = row + pos[0 ], nextCol = col + pos[1 ];
254+ // 位置越界
255+ if (nextRow < 0 || nextRow >= board. length || nextCol < 0 || nextCol >= board[0 ]. length)
256+ continue ;
257+ // 新位置值不是 'O'
258+ if (board[nextRow][nextCol] != ' O' ) continue ;
259+ board[nextRow][nextCol] = ' A' ; // 修改为特殊值
260+ dfs(board, nextRow, nextCol);
261+ }
262+ }
263+
264+ public void solve (char [][] board ) {
265+ int rowSize = board. length, colSize = board[0 ]. length;
266+ // 从左侧遍、右侧遍遍历
267+ for (int row = 0 ; row < rowSize; row++ ) {
268+ if (board[row][0 ] == ' O' ) {
269+ board[row][0 ] = ' A' ;
270+ dfs(board, row, 0 );
271+ }
272+ if (board[row][colSize - 1 ] == ' O' ) {
273+ board[row][colSize - 1 ] = ' A' ;
274+ dfs(board, row, colSize - 1 );
275+ }
276+ }
277+ // 从上边和下边遍历,在对左侧边和右侧边遍历时我们已经遍历了矩阵的四个角
278+ // 所以在遍历上边和下边时可以不用遍历四个角
279+ for (int col = 1 ; col < colSize - 1 ; col++ ) {
280+ if (board[0 ][col] == ' O' ) {
281+ board[0 ][col] = ' A' ;
282+ dfs(board, 0 , col);
283+ }
284+ if (board[rowSize - 1 ][col] == ' O' ) {
285+ board[rowSize - 1 ][col] = ' A' ;
286+ dfs(board, rowSize - 1 , col);
287+ }
288+ }
289+ // 遍历数组,把 'O' 修改成 'X',特殊值修改成 'O'
290+ for (int row = 0 ; row < rowSize; row++ ) {
291+ for (int col = 0 ; col < colSize; col++ ) {
292+ if (board[row][col] == ' O' ) board[row][col] = ' X' ;
293+ else if (board[row][col] == ' A' ) board[row][col] = ' O' ;
294+ }
295+ }
296+ }
297+ }
298+ ```
299+
87300<p align =" center " >
88301<a href =" https://programmercarl.com/other/kstar.html " target =" _blank " >
89302 <img src =" ../pics/网站星球宣传海报.jpg " width =" 1000 " />
90303</a >
304+
0 commit comments