Surrounded Regions

http://www.lintcode.com/en/problem/surrounded-regions/

package com.LintCode.Surrounded;

public class Solution {
    /*
     * @param board: board a 2D board containing 'X' and 'O'
     * @return: nothing
     */
    public void surroundedRegions(char[][] board) {
        // write your code here
//        用一个数组来记录子的生死情况
//        我们先从边上找活子,找到一个就把和它相联系的全部给记录成活的。其它的子就全是死的。
        int m = board.length;
        if (m == 0) {
            return;
        }
        int n = board[0].length;
        if (n == 0) {
            return;
        }
        boolean[][] living = new boolean[m][n];
//            左边
        for (int i = 0; i < m; i++) {
            tree(i, 0, board, living, m, n);
        }
//        上边
        for (int i = 0; i < n; i++) {
            tree(0, i, board, living, m, n);
        }
//        右边
        for (int i = 0; i < m; i++) {
            tree(i, n - 1, board, living, m, n);
        }
//        下边
        for (int i = 0; i < n; i++) {
            tree(m - 1, i, board, living, m, n);
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == 'O' && !living[i][j]) {
                    board[i][j] = 'X';
                }
            }
        }
    }

    private void tree(int i, int j, char[][] board, boolean[][] living, int m, int n) {
        if (i >= 0 && i < m && j >= 0 && j < n) {
            if (living[i][j]) {
                return;
            }
            if (board[i][j] == 'O') {
                living[i][j] = true;
                tree(i - 1, j, board, living, m, n);
                tree(i + 1, j, board, living, m, n);
                tree(i, j + 1, board, living, m, n);
                tree(i, j - 1, board, living, m, n);
            }
        }

    }
}

你可能感兴趣的:(Surrounded Regions)