1. 程式人生 > >leetcode130.被圍繞的區域

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);
    }
};