[Lintcode]Surrounded Regions

来源:互联网 发布:微信朋友圈的网络骗局 编辑:程序博客网 时间:2024/06/01 10:11

Given a 2D board containing 'X' and '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 XX O O XX X O XX O X X

After capture all regions surrounded by 'X', the board should be:

X X X XX X X XX X X XX O X X
分析:首先标记所有不被包围的O,比如改为F。对每一个不被包围的O,与其相连的点肯定不被包围。然后遍历,将剩余的O改为X。之后将F恢复为O。如果正向考虑,每一个点判断其是否被包围,那么需要考虑的情况非常多,需要考虑每一个相邻的点是否被包围,从而需要确定所有相邻的点不会遇到边界。但是反过来标记不被包围的点,则简单一些

public class Solution {    /**     * @param board a 2D board containing 'X' and 'O'     * @return void     */    public void surroundedRegions(char[][] board) {        if(board.length == 0) return;        if(board[0].length == 0) return;                for(int i = 0; i < board.length; i++) {            if(board[i][0] == 'O') {                fill(board, i, 0);            }            if(board[i][board[0].length - 1] == 'O') {                fill(board, i, board[0].length - 1);            }        }                for(int i = 0; i < board[0].length; i++) {            if(board[0][i] == 'O') {                fill(board, 0, i);            }            if(board[board.length - 1][i] == 'O') {                fill(board, board.length - 1, i);            }           }                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';                if(board[i][j] == 'F') board[i][j] = 'O';            }        }    }        void fill(char[][] board, int x, int y) {        if(x < 0 || x >= board.length || y < 0 || y >= board[0].length) return;        if(board[x][y] != 'O') return;                board[x][y] = 'F';        fill(board, x + 1, y);        fill(board, x - 1, y);        fill(board, x, y - 1);        fill(board, x, y + 1);    }}




0 0