若矩阵四边全为‘X’,则矩阵内一定全部都要改为‘X’.....所有不全被包围的‘O’一定与四边上的'O'是联通的....因而我们从矩阵四条边入手,向内遍历并标记所有和边上的'O'联通的‘O’...
之后第二次便利矩阵...将O改为X,标记过的改为O即可....
难点在于从四边上的O向内查找并标记联通O的时候,递归在面对大数据时会超时,这就要求我们 向四周递归时要做好剪枝尽量减少递归次数
public class Solution {
int rows,cols;
public void solve(char[][] board) {
rows = board.length;
if(rows<=2)
{
return ;
}
cols = board[0].length;
if(cols<=2)
{
return ;
}
for(int i=0;i<rows;i++)
{
if(board[i][0]=='O')
{
fun(i,0,board);
}
if(board[i][cols-1]=='O')
{
fun(i,cols-1,board);
}
}
for(int j=0;j<cols;j++)
{
if(board[0][j]=='O')
{
fun(0,j,board);
}
if(board[rows][j]=='O')
{
fun(rows-1,j,board);
}
}
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
{
if(board[i][j]=='O')
{
board[i][j] = 'X';
}
else if(board[i][j]=='*')
{
board[i][j] = 'O';
}
}
}
return ;
}
void fun(int r,int c,char[][] board)
{
if(r<0||r>=rows||c<0||c>=cols)
{
return ;
}
if(board[r][c]=='O')
{
board[r][c]='*';
if(r-1>=0&&board[r-1][c]=='O')
{
fun(r-1,c,board);
}
if(r+1<=rows-1&&board[r+1][c]=='O')
{
fun(r+1,c,board);
}
if(c-1>=0&&board[r][c-1]=='O')
{
fun(r,c-1,board);
}
if(c+1<=cols-1&&board[r][c+1]=='O')
{
fun(r,c+1,board);
}
}
return ;
}
}