题目:
Given a 2D board containing 'X'
and 'O'
, capture all regions surrounded by 'X'
.
A region is captured by flipping all 'O'
s into 'X'
s in that surrounded region.
For example,
X X X X X O O X X X O X X O X X
After running your function, the board should be:
X X X X X X X X X X X X X O X X思路:这道题如果按题意从里往外找会很麻烦,如果从边界以此判断是否为'O',然后找出与这些'O'相连的O,并标记,最后将未标记的元素全部置为X,标记的置为O,完成代码。至于怎么标记,有两种方法,刚开始我重新开了一个二维矩阵标记元素,后来发现直接在原矩阵里标记也可以。
这是我第一遍的代码:
class Solution {
public:
void searchit(bool **visit,vector<vector<char>> &board,int m,int n,int i,int j)
{
if(i-1>=0&&visit[i-1][j]==false&&board[i-1][j]=='O')
{
visit[i-1][j]=true;
searchit(visit,board,m,n,i-1,j);
}
if(i+1<m&&visit[i+1][j]==false&&board[i+1][j]=='O')
{
visit[i+1][j]=true;
searchit(visit,board,m,n,i+1,j);
}
if(j-1>=0&&visit[i][j-1]==false&&board[i][j-1]=='O')
{
visit[i][j-1]=true;
searchit(visit,board,m,n,i,j-1);
}
if(j+1<m&&visit[i][j+1]==false&&board[i][j+1]=='O')
{
visit[i][j+1]=true;
searchit(visit,board,m,n,i,j+1);
}
}
void solve(vector<vector<char>> &board) {
int row=board.size();
if(row==0)return;
int col=board[0].size();
bool **visit=new bool*[row];
for(int i=0;i<row;i++)
visit[i]=new bool[col];
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
visit[i][j]=false;
for(int i=0;i<col;i++)
{
if(board[0][i]=='O'&&visit[0][i]==false)
{
visit[0][i]=true;
searchit(visit,board,row,col,0,i);
}
if(board[row-1][i]=='O'&&visit[row-1][i]==false)
{
visit[row-1][i]=true;
searchit(visit,board,row,col,row-1,i);
}
}
for(int i=1;i<row-1;i++)
{
if(board[i][0]=='O'&&visit[i][0]==false)
{
visit[i][0]=true;
searchit(visit,board,row,col,i,0);
}
if(board[i][col-1]=='O'&&visit[i][col-1]==false)
{
visit[i][col-1]=true;
searchit(visit,board,row,col,i,col-1);
}
}
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
{
if(visit[i][j])
board[i][j]='O';
else
board[i][j]='X';
}
return;
}
};
由于爆栈,RE了,一直不明白怎么改,后来参考其他人的,稍加修改,可以AC了。代码如下:
class Solution {
public:
void searchit(bool **visit,vector<vector<char>> &board,int m,int n,int i,int j)
{
if(i-1>=0&&visit[i-1][j]==false&&board[i-1][j]=='O')
{
visit[i-1][j]=true;
searchit(visit,board,m,n,i-1,j);
}
if(i+1<m&&visit[i+1][j]==false&&board[i+1][j]=='O')
{
visit[i+1][j]=true;
searchit(visit,board,m,n,i+1,j);
}
if(j-1>=0&&visit[i][j-1]==false&&board[i][j-1]=='O')
{
visit[i][j-1]=true;
searchit(visit,board,m,n,i,j-1);
}
if(j+1<m&&visit[i][j+1]==false&&board[i][j+1]=='O')
{
visit[i][j+1]=true;
searchit(visit,board,m,n,i,j+1);
}
}
void solve(vector<vector<char>> &board) {
int row=board.size();
if(row==0)return;
int col=board[0].size();
bool **visit=new bool*[row];
for(int i=0;i<row;i++)
visit[i]=new bool[col];
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
visit[i][j]=false;
for(int i=0;i<col;i++)
{
if(board[0][i]=='O'&&visit[0][i]==false)
{
visit[0][i]=true;
}
if(board[row-1][i]=='O'&&visit[row-1][i]==false)
{
visit[row-1][i]=true;
}
}
for(int i=1;i<row-1;i++)
{
if(board[i][0]=='O'&&visit[i][0]==false)
{
visit[i][0]=true;
}
if(board[i][col-1]=='O'&&visit[i][col-1]==false)
{
visit[i][col-1]=true;
}
}
for(int i=0;i<col;i++)
{
if(board[0][i]=='O')
{
searchit(visit,board,row,col,0,i);
}
if(board[row-1][i]=='O')
{
searchit(visit,board,row,col,row-1,i);
}
}
for(int i=1;i<row-1;i++)
{
if(board[i][0]=='O')
{
searchit(visit,board,row,col,i,0);
}
if(board[i][col-1]=='O')
{
searchit(visit,board,row,col,i,col-1);
}
}
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
{
if(visit[i][j])
board[i][j]='O';
else
board[i][j]='X';
}
return;
}
};
还有一种比较好的标记办法,将需要标记的元素置为M(或者其他字母),最后将这些标记的置为O,其他的置为X。