Surrounded Regions 感染列岛

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.

For 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

感染列岛 哈哈

挺有意思一道题,讲解 和code http://www.cnblogs.com/huntfor/p/3898068.html

题解

// XXXXX -->  X X X X X --> XXXX
// XOXOX    X# X O X   XOXX
// XOXOX    X# X O X   XOXX
// XOXXX    X# X X X   XOXX

用queue来存储,这样后面加进来的传染源就不会干扰之前的传染源传染

public class Solution {
    public void solve(char[][] board) {
        if(board==null||board.length<=1||board[0].length<=1 ) return;
        for(int i=0;i<board.length;i++){ // fist col
            helper(board, i, 0);
            helper(board, i, board[0].length-1); // last col
        }
        for(int j=0;j<board[0].length;j++){ //first row
            helper(board, 0, j);
             helper(board, board.length-1, j); // last row
        }
        for(int i=0;i<board.length;i++){
            for(int j=0;j<board[0].length;j++){
                if(board[i][j]!='#'){
                    board[i][j] = 'X';
                }else
                    board[i][j] = 'O';
            }
        }
    }
    private void helper(char[][] b, int i, int j){
        if(b[i][j]!='O') return;
        b[i][j]='#';
        int code = b[0].length*i+j;
        
        LinkedList<Integer> queue = new LinkedList<Integer>(); // 为了从外围逐渐向中心渲染
        queue.add(code);
        while(!queue.isEmpty()){
            int c = queue.poll();
            int row = c/b[0].length;
            int col = c%b[0].length;
            //up
            if(row>0 && b[row-1][col]=='O'){
                b[row-1][col]='#';
                queue.add(b[0].length*(row-1)+col);
            }
            //down
            if(row<b.length-1 && b[row+1][col]=='O'){
                b[row+1][col]='#';
                queue.add(b[0].length*(row+1)+col);
            }
            //left
            if(col>0 && b[row][col-1]=='O'){
                b[row][col-1]='#';
                queue.add(b[0].length*(row)+col-1);
            }
            //right
            if(col< b[0].length-1 && b[row][col+1]=='O'){
                b[row][col+1]='#';
                queue.add(b[0].length*(row)+col+1);
            }
        }
    }
}

 

posted @ 2015-06-11 06:29  世界到处都是小星星  阅读(269)  评论(0编辑  收藏  举报