leetcode130.被围绕的区域

题目:

给定一个二维的矩阵,包含 '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);
    }
};

猜你喜欢

转载自blog.csdn.net/Adolph_qiang/article/details/85064358