Leetcode - how-many-numbers-are-smaller-than-the-current-number
Leetcode - max-area-of-island

Leetcode - surrounded-regions

violet posted @ Mar 11, 2020 06:36:33 AM in 算法 with tags ruby Algorithm BFS Golang , 515 阅读

https://leetcode.com/problems/surrounded-regions

Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'.

A region is captured by flipping all 'O's into 'X's in that surrounded region.

Example:

X X X X
X O O X
X X O X
X O X X

After running your function, the board should be:

X X X X
X X X X
X X X X
X O X X

Firstly what I was thinking about is finding all X which surround the O. I found that it's very difficult to tackle things done cause X may not be tracked either by bfs and dfs. I learned another way from the discussion here

It should find all O from the boarder and use bfs or dfs to track all O surrounding boarder O. Mark them as "Y". And then iterate in the board, mark all O into X. Mark all Y to O in the end.

# @param {Character[][]} board
# @return {Void} Do not return anything, modify board in-place instead.
def solve(board)
    return if board.length == 0 || board[0].length == 0
    queue = []
    for i in 0..board.length-1
        [0, board[0].length-1].each do |j|
            queue << [i, j] if board[i][j] == "O"
        end
    end
    for j in 0..board[0].length-1
        [0, board.length-1].each do |i|
            queue << [i, j] if board[i][j] == "O"
        end
    end
    mark_O(board, queue)
    for i in 0..board.length-1
        for j in 0..board[0].length-1
            board[i][j] = "X" if board[i][j] == "O"
        end
    end
    for i in 0..board.length-1
        for j in 0..board[0].length-1
            board[i][j] = "O" if board[i][j] == "Y"
        end
    end
end

def mark_O(board, queue)
    directions = [[1, 0], [-1, 0], [0, 1], [0, -1]]
    while queue.length != 0
        size = queue.length
        for k in 0..size-1
            position = queue[k]
            x = position[0]
            y = position[1]
           
            board[x][y] = "Y" if board[x][y] == "O"
            directions.each do |d|
                new_x = x + d[0]
                new_y = y + d[1]
                if new_x >= 0 && new_y >= 0 && new_x < board.length && new_y < board[0].length
                    queue << [new_x, new_y] if board[new_x][new_y] == "O"
                end
            end
        end
        queue = queue[size..-1]
    end
end
func solve(board [][]byte)  {
    if len(board) == 0 || len(board[0]) == 0{
        return
    }
    queue := [][]int{}
    for i := 0; i < len(board); i++ {
        if board[i][0] == 'O' {
            queue = append(queue, []int{i, 0})
        }
        if board[i][len(board[0])-1] == 'O' {
            queue = append(queue, []int{i, len(board[0])-1})
        }
    }
    for j := 0; j < len(board[0])-1; j++ {
        if board[0][j] == 'O' {
            queue = append(queue, []int{0, j})
        }
        if board[len(board)-1][j] == 'O' {
            queue = append(queue, []int{len(board)-1, j})
        }
    }
    board = mark(board, queue)
    for i := 0; i < len(board); i++ {
        for j := 0; j < len(board[0]); j++ {
            if board[i][j] == 'O' {
                board[i][j] = 'X'
            }
        }
    }
    for i := 0; i < len(board); i++ {
        for j := 0; j < len(board[0]); j++ {
            if board[i][j] == 'Y' {
                board[i][j] = 'O'
            }
        }
    }
}

func mark(board [][]byte, queue [][]int) [][]byte {
    directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
    for len(queue) != 0 {
        size := len(queue)
        for k := 0; k < size; k++{
            position := queue[k]
            x := position[0]
            y := position[1]
            if board[x][y] == 'O' {
                board[x][y] = 'Y'
            }
            for _, d := range directions {
                newX := x + d[0]
                newY := y + d[1]
                if newX >= 0 && newY >= 0 && newX < len(board) && newY < len(board[0]) {
                    if board[newX][newY] == 'O' {
                        queue = append(queue, []int{newX, newY})
                    }
                }
            }
        }
        queue = queue[size:]
    }
    return board
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter