原题链接:
https://leetcode.com/problems/surrounded-regions/description/
矩阵中的O分两种:
1.边界上的O以及和它相连的O
2.不和边界上的O相连的O
那么属于第一类的O是不需要变成X的,第二类则需要变成X。
所以解题思路就是:
1.先找到边界上的O,然后用DFS寻找和它相连的O(类似number of island那道题),把这些O标记成‘*’(当然其他任何符号都可以,除了X和O)
2.那么矩阵中剩下的O都是需要变成X的,只需要遍历矩阵元素,把O都变成X,再把星号都变回O就行了。
代码如下:
class Solution {
private:
int m, n;
int move[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
bool inArea(int x, int y)
{
return x < m && x >= 0 && y >= 0 && y <n;
}
bool isBoundry(int x, int y)
{
return x == 0 || x == m-1 || y == 0 || y == n-1;
}
void dfs(vector<vector<char>>& board, int x, int y)
{
board[x][y] = '*';
for(int i = 0; i < 4; ++i)
{
int newx = x + move[i][0];
int newy = y + move[i][1];
if(inArea(newx, newy) && board[newx][newy] == 'O')
dfs(board, newx, newy);
}
return;
}
public:
void solve(vector<vector<char>>& board) {
m = board.size();
if(m == 0) return;
n = board[0].size();
for(int i = 0; i < m; ++i)
for(int j = 0; j < n; ++j)
if(isBoundry(i, j) && board[i][j] == 'O') dfs(board, i, j);
for(int i = 0; i < m; ++i)
for(int j = 0; j < n; ++j)
{
if(board[i][j] == 'O') board[i][j] = 'X';
if(board[i][j] == '*') board[i][j] = 'O';
}
}
};