Surrounded-Regions

来源:互联网 发布:昆仑通态触摸屏软件 编辑:程序博客网 时间:2024/06/05 05:01
packagecom.ytx.array;
/**130题 
 *  Given a 2D board containing'X'and'O', capture all regions surrounded by'X'.
    A region is captured byflipping 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
 *
 *  给你一块2维的包含'X'或者'O'的板,找到所有被'X'包围的区域, 把区域内的‘O‘翻转成’X’。
 *@authoryuantian xin
 *
 *思路:连通性问题,用dfsbfs都可以解决。逆向思维,求所有封闭的O,可以先求出所有连通的O,保存起来,再把其它的O改成X即可。只有在从边界上
 *连通的O才不会被X封闭。所以从边界上四条边界上进行深搜或者广搜,找到所有连通的O。
 */
publicclass Surrounded_regions {
       //二维矩阵的行数
       publicint rowNum;
       //二维矩阵的列数
       publicint colNum;
       
       /**
        * 利用深搜从边界上开始找,找到所有与边界上O连通的所有O,
        * 把所有连通的O变成*保存起来,那么剩下的O都是封闭的,被X包围的
        *@param index_x 二维数组的索引行
        *@param index_y 二维数据的索引列
        *@param board   二维数据
        */
       publicvoid dfs(intindex_x,int index_y, char board[][]) {
             if(board[index_x][index_y] == 'O') {
                    //是O才继续往下找,把所有连通的O都变成*,之后再变回来
                    board[index_x][index_y] = '*';
                    
                    //向上找
                    if(index_x> 1) {
                           dfs(index_x- 1,index_y,board);
                    }
                    
                    //向下找
                    if(index_x< rowNum - 1) {
                           dfs(index_x+1,index_y,board);
                    }
                    
                    //向左找
                    if(index_y> 1) {
                           dfs(index_x,index_y - 1, board);
                    }
                    
                    //向右找
                    if(index_y< colNum -1) {
                           dfs(index_x,index_y + 1, board);
                    }
             }
       }
       
       /**
        * 解决的办法,找到所有与边界上的O连通的O,改成*,剩下的不连通的
        * 改成X,最后把*变回O即可
        *@param board
        */
       publicvoid solve(char[][]board) {
             
             if(board== null || board.length<= 0 || board[0].length<= 0) {
                    return;
             }
             rowNum= board.length;
             colNum= board.length;
             
             //从第0列和最后一列开始找,递归深搜
             for(inti = 0; i < rowNum;i++) {
                    dfs(i,0,board);
                    dfs(i,colNum- 1, board);
             }
             
             //从第一行和最后一行开始找
             for(intj = 0; j < colNum;j++) {
                    dfs(0,j,board);
                    dfs(rowNum- 1, j, board);
             }
             
             //遍历二维数组,剩下不连通的O全部变成X,把*变回O。
             for(inti = 0; i < rowNum;i++) {
                    for(intj = 0; j < colNum;j++) {
                           
                           if(board[i][j] == 'O') {
                                 board[i][j] = 'X';
                           }
                           
                           if(board[i][j] == '*') {
                                 board[i][j] ='O';
                           }
                    }
             }
       }
       publicstatic void main(String[]args) {
             charboard [][] ={{'X','X','X','X'},{'X','O','O','X'},{'X','X','O','X'},{'X','O','X','X'}};
             for(inti = 0; i < board.length;i++) {
                    for(intj = 0; j < board[0].length;j++) {
                           
                           System.out.print(board[i][j] + " ");
                    }
                    System.out.println("");
             }
             
             System.out.println("---------");
             Surrounded_regionssr = newSurrounded_regions();
             sr.solve(board);
             for(inti = 0; i < board.length;i++) {
                    for(intj = 0; j < board[0].length;j++) {
                           
                           System.out.print(board[i][j] + " ");
                    }
                    System.out.println("");
             }
       }
}
原创粉丝点击