pub fn solve_surrounded_regions(board: &mut Vec<Vec<char>>) {
let rows = board.len();
let cols = if rows > 0 { board[0].len() } else { 0 };
fn dfs(board: &mut Vec<Vec<char>>, r: usize, c: usize, rows: usize, cols: usize) {
if r >= rows || c >= cols || board[r][c] != 'O' { return; }
board[r][c] = '#';
if r > 0 { dfs(board, r-1, c, rows, cols); }
if c > 0 { dfs(board, r, c-1, rows, cols); }
if r+1 < rows { dfs(board, r+1, c, rows, cols); }
if c+1 < cols { dfs(board, r, c+1, rows, cols); }
}
for r in 0..rows {
if board[r][0] == 'O' { dfs(board, r, 0, rows, cols); }
if board[r][cols-1] == 'O' { dfs(board, r, cols-1, rows, cols); }
}
for c in 0..cols {
if board[0][c] == 'O' { dfs(board, 0, c, rows, cols); }
if board[rows-1][c] == 'O' { dfs(board, rows-1, c, rows, cols); }
}
for r in 0..rows {
for c in 0..cols {
if board[r][c] == 'O' { board[r][c] = 'X'; }
if board[r][c] == '#' { board[r][c] = 'O'; }
}
}
}