SurroundedRegions

来源:互联网 发布:软件研发项目立项 编辑:程序博客网 时间:2024/06/11 01:17
1.问题描述
给定一个包含'X'和'O'的2D板,捕捉所有被'X'包围的区域。一个区域通过在所围绕的区域中将所有的'O'翻转成'X'来捕获。
2.解题思路
采用递归解决,若区域中某个位置的元素为'O'则对其元素转换为'*',则对其上下左右相邻元素进行处理
3.程序源码
public void DFS(char[][] board, int row, int col)
    {
        if(row < 0 || row>(board.length - 1) || col < 0 || col >(board[0].length -1) ) return ;
        if(board[row][col] == 'O') //如果row,col指定的位置为'O',则标记为'*',除此之外对其上下左右进行递归处理
            {
                board[row][col] = '*';
                DFS(board, row-1,col);
                DFS(board,row+1,col);
                DFS(board,row,col-1);
                DFS(board,row,col+1);
            }
    }
    public void solve(char[][] board) {
        if(board.length <= 0) return;
        int row = board.length;
        int col = board[0].length;
        for(int i = 0 ; i != row ; i++) {
            DFS(board,i,col-1); //从第i行第col-1列的元素开始递归处理
            DFS(board,i,0);//从第i行第0列元素开始递归处理
         }
        for(int i = 0 ; i != col ;i++)
       {
         DFS(board,0,i); //从第0行第i列的元素开始递归处理
         DFS(board,row-1,i);//从第row-1行第i列的元素开始递归处理
        }
        for(int i = 0 ; i != row ; i++)
          for(int j = 0 ; j != col ; j++)
              { if(board[i][j] == 'O') board[i][j] = 'X';
                if(board[i][j] == '*') board[i][j] = 'O';
              }
     }