题目:

给定一个二维的矩阵,包含 \'X\' 和 \'O\'字母 O)。

找到所有被 \'X\' 围绕的区域,并将这些区域里所有的 \'O\' 用 \'X\' 填充。

示例:

X X X X
X O O X
X X O X
X O X X

运行你的函数后,矩阵变为:

X X X X
X X X X
X X X X
X O X X

解释:

被围绕的区间不会存在于边界上,换句话说,任何边界上的 \'O\' 都不会被填充为 \'X\'。 任何不在边界上,或不与边界上的 \'O\' 相连的 \'O\' 最终都会被填充为 \'X\'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

1.先将用两重循环将二维数组逐个判断,结果

#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
    void solve(vector<vector<char> >& board) {
        if(board.size()==0)return;
         for(int i=1;i<board.size()-1;i++){
            for(int j=1;j<board[0].size()-1;j++){
                if(board[i][j]==\'O\')
                    if(dfs(board,i,j))//如果O是被包围的部分
                        Dfs(board,i,j);//将该区域全部置为‘X’
            }
        }
    }
    void Dfs(vector<vector<char> >& board,int i,int j){
           if(board[i][j]==\'O\'){
           board[i][j]=\'X\';
           dfs(board,i+1,j);
           dfs(board,i,j+1);
           dfs(board,i-1,j);
           dfs(board,i,j-1);
           }
    }
    bool dfs(vector<vector<char> >& board,int i,int j){//判断是否为被包围的O
        int x=board.size();
        int y=board[0].size();
        if(board[i][j]==\'X\')return true;
        if(i==0||j==0||i==x-1||j==y-1) return false;
        board[i][j]=\'X\';
        bool result= dfs(board,i+1,j)&&
                     dfs(board,i,j+1)&&
                     dfs(board,i-1,j)&&
                     dfs(board,i,j-1);
        board[i][j]=\'O\';
        return result;
    }
};
int main()
{   vector<vector<char> > board(4,vector<char>(4,\'X\'));
    board[1][1]=\'O\';
    board[1][2]=\'O\';
    board[2][2]=\'O\';
    board[3][1]=\'O\';
    Solution a;
    a.solve(board);
    for(int i=0;i<board.size();i++){
            for(int j=0;j<board[0].size();j++)
                cout<<board[i][j]<<\" \";
            cout<<endl;
    }
    return 0;
}

\"\"

发现,若不被包围的区域过大时,我需要重复的从每一个O开始DFS,耗费时间颇多(N方次遍历),从四周搜索与边缘相连的区域,做好标记(4N次遍历),差一个数量级。

 

class Solution {
public:
    void solve(vector<vector<char> >& board) {
        if(board.empty()||board.size()==1||board[0].size()==1)return;
         for(int i=0;i<board.size();i++)
        {
            if(board[i][0]==\'O\')
                dfs(board,i,0);
            if(board[i][board[0].size()-1]==\'O\')
                dfs(board,i,board[0].size()-1);
        }
        for(int i=0;i<board[0].size();i++)
        {
            if(board[0][i]==\'O\')
                dfs(board,0,i);
            if(board[board.size()-1][i]==\'O\')
               dfs(board,board.size()-1,i);
        }
         for(int i=0;i<board.size();i++){
                for(int j=0;j<board[0].size();j++){
                    if(board[i][j]==\'V\')
                        board[i][j]=\'O\';
                    else if(board[i][j]==\'O\')
                        board[i][j]=\'X\';

                }

         }

    }
    void dfs(vector<vector<char> >& board,int i,int j){
        if(i<0||j<0||i>board.size()-1||j>board[0].size()-1)
            return ;
        if(board[i][j]!=\'O\')
            return;
        board[i][j]=\'V\';
        dfs(board,i+1,j);
        dfs(board,i,j+1);
        dfs(board,i-1,j);
        dfs(board,i,j-1);
    }
};

 

 

 

 

收藏 打印