1、题目
https://leetcode-cn.com/problems/surrounded-regions/
2、题意
题解1:dfs 逆向思维,搜所有边界为‘O’的点,边界’O‘所连的点最终为’O’,其他所有为’X’;
开个st数组记录 最后更新
class Solution {
public:
vector<vector<bool>> st;
int m,n;
void dfs(vector<vector<char>> &board,int a,int b)
{
int dx[4] = {1,-1,0,0},dy[4] = {0,0,1,-1};
st[a][b] = true;
for(int i=0;i<4;i++)
{
int x = dx[i]+a,y = dy[i]+b;
if(x>=0&&x<m&&y>=0&&y<n&&board[x][y]=='O'&&!st[x][y])
dfs(board,x,y);
}
}
void solve(vector<vector<char>>& board) {
if(!board.size()) return;
m = board.size(),n = board[0].size();
st = vector<vector<bool>>(m,vector<bool>(n,false));
for(int i=0;i<m;i++)
{
if(board[i][0]=='O') dfs(board,i,0);
if(board[i][n-1]=='O') dfs(board,i,n-1);
}
for(int i=0;i<n;i++)
{
if(board[0][i]=='O') dfs(board,0,i);
if(board[m-1][i]=='O') dfs(board,m-1,i);
}
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(!st[i][j])
board[i][j] = 'X';
}
};
bfs同理
class Solution {
public:
vector<vector<bool>> st;
int m,n;
void bfs(vector<vector<char>> &board,int a,int b)
{
int dx[4] = {1,-1,0,0},dy[4] = {0,0,1,-1};
st[a][b] = true;
queue<pair<int,int>> q;
q.push(make_pair(a,b));
while(q.size())
{
pair<int,int> t =q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x = dx[i]+t.first,y = dy[i]+t.second;
if(x>=0&&x<m&&y>=0&&y<n&&board[x][y]=='O'&&!st[x][y])
{
st[x][y] = true;
q.push(make_pair(x,y));
}
}
}
}
void solve(vector<vector<char>>& board) {
if(!board.size()) return;
m = board.size(),n = board[0].size();
st = vector<vector<bool>>(m,vector<bool>(n,false));
for(int i=0;i<m;i++)
{
if(board[i][0]=='O') bfs(board,i,0);
if(board[i][n-1]=='O') bfs(board,i,n-1);
}
for(int i=0;i<n;i++)
{
if(board[0][i]=='O') bfs(board,0,i);
if(board[m-1][i]=='O') bfs(board,m-1,i);
}
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(!st[i][j])
board[i][j] = 'X';
}
};