Surrounded Regions
To solve this coding challenge involving surrounded regions in an m x n board containing 'X' and 'O', we'll use a Depth-First Search (DFS) approach. Through DFS, we'll identify and mark the 'O's that are connected to the border and hence should not be flipped. The rest of the 'O's will be converted to 'X's.
Explanation
The challenge requires that any 'O' not on the border and not connected to an 'O' on the border be flipped to 'X'. Here's a detailed approach to achieve this:- Initialization :
- If the board is empty, simply return.
- Determine the number of rows and columns in the board.
- DFS Marking :
- We will define a DFS function that marks 'O's connected to the border with a temporary character, say 'S'.
- Traverse through the border of the board and apply the DFS function to mark all 'O's connected to the border.
- Region Conversion :
- Iterate through the entire board. If a cell contains 'O', it means it's surrounded and will be converted to 'X'.
- If a cell contains 'S', change it back to 'O' since it was originally connected to the border.
- Initialization :
- Check if the board is empty and return if so to avoid any further errors.
- Calculate the number of rows and columns in the board to facilitate navigation.
- DFS Function :
- This function helps mark all connected 'O's starting from any given cell (row, col).
- If the cell is out of bounds or is not an 'O', the function returns.
- Otherwise, mark the cell as 'S' (a placeholder to indicate it's connected to the border) and recursively apply DFS in all four directions.
- Mark Border-Connected 'O's :
- Apply the DFS function to all border cells (both on rows and columns).
- This step ensures all border-connected 'O's are marked with 'S'.
- Convert the Regions :
- Iterate through every cell in the board.
- Convert 'O's (that are not marked) to 'X' since they are surrounded.
- Revert the 'S' cells back to 'O' as they represent the border-connected regions.
Pseudocode
Step 1: Initialization
# Check if the board is empty, if so, return immediately
if board is empty:
return
# Determine the number of rows and columns
number_of_rows = length of board
number_of_columns = length of the first row in board
Step 2: Define the DFS Function
# Define the DFS function to mark connected 'O's with 'S'
function dfs(row, col):
# Check for base cases: if index is out of bounds or the cell is not 'O'
if row is out of bounds or col is out of bounds or board[row][col] is not 'O':
return
# Mark the cell as 'S' to identify it as connected to the border
board[row][col] = 'S'
# Explore all 4-directionally connected neighbors
dfs(row + 1, col) # down
dfs(row - 1, col) # up
dfs(row, col + 1) # right
dfs(row, col - 1) # left
Step 3: Mark Border-Connected 'O's
# Traverse and apply DFS to all 'O's on the border rows and columns
for each row from 0 to number_of_rows - 1:
dfs(row, 0) # First column
dfs(row, number_of_columns-1) # Last column
for each column from 0 to number_of_columns - 1:
dfs(0, column) # First row
dfs(number_of_rows-1, column) # Last row
Step 4: Convert Regions
# Iterate through the entire board to convert the regions
for each row from 0 to number_of_rows - 1:
for each column from 0 to number_of_columns - 1:
if cell contains 'O':
# This 'O' is surrounded and should be flipped to 'X'
board[row][col] = 'X'
else if cell contains 'S':
# This 'O' was connected to the border, revert it back to 'O'
board[row][col] = 'O'