美文网首页
surrounded-regions

surrounded-regions

作者: 瞬铭 | 来源:发表于2019-12-03 12:14 被阅读0次

https://leetcode.com/problems/surrounded-regions/
类似于围棋的算法,一个二维矩阵,由字母‘X’和字母'O'组成,当发现一个O被X包围的时候,把O都换成X,但是有例外,当O在矩阵的边缘的时候,不算被包围,且跟边缘相连通(水平或者垂直)的O也不算被包围

思路
先找出边缘不能变的O,那么其他的O就都是被包围的了,一定能变

如何找出边缘不能变的O?遍历矩阵的四周(第一行和最后一行,第一列和最后一列),只要发现边缘有O,然后利用BFS,找到他的临近的O,并统统都变成一个临时的字符,比如‘#’

边缘的O都找完后怎么办? 重新遍历矩阵里面的所有格子,如果发现O就变成X,如果发现#,就变成O

 public void solve(char board[][]) {
        if (board == null || board.length <= 1 || board[0].length <= 1) {
            return;
        }

        //第一行和最后一行进行变化fill
        for (int i = 0; i < board[0].length; i++) {
            fill(board, 0, i);
            fill(board, board.length - 1, i);
        }

        //第一列和最后一列变化fill
        for (int i = 0; i < board.length; i++) {
            fill(board, i, 0);
            fill(board, i, board[0].length - 1);
        }

        //对于当前格子,所有的O变成X
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (board[i][j] == 'O') {
                    board[i][j] = 'X';
                } else if (board[i][j] == '#') {
                    board[i][j] = 'O';
                }
            }
        }
    }

    public void fill(char[][] board, int i, int j) {
        if (board[i][j] != 'O') {
            return;
        }

        board[i][j] = '#';

        //查看i,j四周的坐标,如果存在'O',则一并变成'#'
        if (i > 0 && board[i - 1][j] == 'O') {
            fill(board, i - 1, j);
        }

        if (j < board[i].length - 1 && board[i][j + 1] == 'O') {
            fill(board, i, j + 1);
        }

        if (i < board.length - 1 && board[i + 1][j] == 'O') {
            fill(board, i + 1, j);
        }

        if (j > 0 && board[i][j - 1] == 'O') {
            fill(board, i, j - 1);
        }
    }

相关文章

网友评论

      本文标题:surrounded-regions

      本文链接:https://www.haomeiwen.com/subject/yzrcgctx.html