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