https://leetcode.com/problems/surrounded-regions/blog
解法一:dfs。找處在邊緣上的O
而後dfs將與之相鄰的O
都改成#
。處理完以後再把這時候的O
改成X
,#
改成O
便可leetcode
class Solution { public: void solve(vector<vector<char>>& board) { int n = board.size(); for(int i = 0;i < n;i++) { for(int j = 0;j < board[i].size();j++) { if((i == 0 || i == n-1 || j == 0 ||j == board[i].size()-1) && board[i][j] == 'O') dfs(board,i,j); } } for(int i = 0;i < n;i++) { for(int j = 0;j < board[i].size();j++) { if(board[i][j] == 'O') board[i][j] = 'X'; if(board[i][j] == '#') board[i][j] = 'O'; } } } void dfs(vector<vector<char>>& board,int i,int j) { if (board[i][j] == 'O') { board[i][j] = '#'; if (i > 0 && board[i - 1][j] == 'O') dfs(board, i - 1, j); if (j < board[i].size() - 1 && board[i][j + 1] == 'O') dfs(board, i, j + 1); if (i < board.size() - 1 && board[i + 1][j] == 'O') dfs(board, i + 1, j); if (j > 0 && board[i][j - 1] == 'O') dfs(board, i, j - 1); } } };
解法二:bfs。基本上同樣的思路,仍是找處在邊緣上的O
而後bfs將與之相鄰的O
都改成#
。處理完以後再把這時候的O
改成X
,#
改成O
便可get
class Solution { public: void solve(vector<vector<char>>& board) { int n = board.size(); for(int i = 0;i < n;i++) { for(int j = 0;j < board[i].size();j++) { if((i == 0 || i == n-1 || j == 0 ||j == board[i].size()-1) && board[i][j] == 'O') dfs(board,i,j); } } for(int i = 0;i < n;i++) { for(int j = 0;j < board[i].size();j++) { if(board[i][j] == 'O') board[i][j] = 'X'; if(board[i][j] == '#') board[i][j] = 'O'; } } } void dfs(vector<vector<char>>& board,int i,int j) { if (board[i][j] == 'O') { board[i][j] = '#'; if (i > 0 && board[i - 1][j] == 'O') dfs(board, i - 1, j); if (j < board[i].size() - 1 && board[i][j + 1] == 'O') dfs(board, i, j + 1); if (i < board.size() - 1 && board[i + 1][j] == 'O') dfs(board, i + 1, j); if (j > 0 && board[i][j - 1] == 'O') dfs(board, i, j - 1); } } };