今天刷的这道题感觉难度很适中,不过还是得感谢IDE(Clion)强大的代码编写与纠错能力,下面就和大家分享一下经验吧!
题目如下:
题意分析:
给定一个包含字母‘X’和'O'的二维平面,请将所有被‘X’包围的'O'替换成‘X’。注:在边界上的'O'是无法被‘X’包围的,所以不需要替换成‘X’。
方法一(DFS递归法)
先扫描二维平面的四条边,如果有'O'则用DFS遍历,将所有连着的'O'都变成另一个字符'#',然后二维平面中剩余的'O'都是被包围的,于是遍历二维平面将这些'O'变成'X',同时把'#'变回'O'即可。
解题代码如下:
class Solution{
private:
int row, col;
int d[4][2] = {{-1,0},{0,-1},{1,0},{0,1}};
void findsolve( vector<vector<char>>& board, int startx, int starty ){
board[startx][starty] = '#';
for (int i = 0; i < 4; ++i) {
int newx = startx + d[i][0];
int newy = starty + d[i][1];
if ( newx >= 0 && newx < row && newy >= 0 && newy < col && board[newx][newy] == 'O')
findsolve( board, newx, newy );
}
return;
}
public:
void solve( vector<vector<char>>& board ){
row = board.size();
if (row == 0 || row == 1) return;
col = board[0].size();
for ( int i = 0; i < row; i = i + row - 1 ) {
for (int j = 0; j < col; j ++ ) {
if ( board[i][j] == 'O' )
findsolve( board, i, j );
}
}
for ( int i = 0; i < row; i ++ ) {
for (int j = 0; j < col; j = j + col -1 ) {
if ( board[i][j] == 'O' )
findsolve( board, i, j );
}
}
for ( int i = 0; i < row; i ++ ) {
for (int j = 0; j < col; j ++ ) {
if ( board[i][j] == 'O' ) board[i][j] = 'X';
if ( board[i][j] == '#' ) board[i][j] = 'O';
}
}
}
};
提交后的结果如下:
方法二(优化方法一)
可以不用两次两层for循环扫描二维平面的四条边,直接一次两层for循环即可完成。
解题代码如下:
class Solution{
private:
int row, col;
int d[4][2] = {{-1,0},{0,-1},{1,0},{0,1}};
void findsolve( vector<vector<char>>& board, int startx, int starty ){
board[startx][starty] = '#';
for (int i = 0; i < 4; ++i) {
int newx = startx + d[i][0];
int newy = starty + d[i][1];
if ( newx >= 0 && newx < row && newy >= 0 && newy < col && board[newx][newy] == 'O')
findsolve( board, newx, newy );
}
return;
}
public:
void solve( vector<vector<char>>& board ){
row = board.size();
if (row == 0 || row == 1) return;
col = board[0].size();
for ( int i = 0; i < row; i ++ ) {
for (int j = 0; j < col; j ++ ) {
if ( i == 0 || j == 0 || i == row-1 || j == col-1 )
if ( board[i][j] == 'O' )
findsolve( board, i, j );
}
}
for ( int i = 0; i < row; i ++ ) {
for (int j = 0; j < col; j ++ ) {
if ( board[i][j] == 'O' ) board[i][j] = 'X';
if ( board[i][j] == '#' ) board[i][j] = 'O';
}
}
}
};
提交后的结果如下:
日积月累,与君共进,增增小结,未完待续。