题目描述:
Given a 2D board containing 'X'
and 'O'
(the letter O), capture all regions surrounded by 'X'
.
A region is captured by flipping all 'O'
s into 'X'
s in that surrounded region.
For example,
X X X X
X O O X
X X O X
X O X X
After running your function, the board should be:
X X X X
X X X X
X X X X
X O X X
解题思路:
题目的要求为把所有被'X'包围的'O'转化为'X',因此,只有与边界接壤的'O'才能存活下来,所以我先从边界开始遍历,把边界上的'O'以及延伸出的'O'全部用'W'替换,然后把二维数组中的'O'全部变为'X',最后再把换'W'换回来。
代码:
1 class Solution { 2 public: 3 void search(vector<vector<char>>& board, int row, int col, char c1, char c2) 4 //寻找延伸出的'O'或是'W',并替换 5 { 6 if(row < 0 || row >= board.size() || col < 0 || col >= board[0].size()) 7 return; 8 if(board[row][col] == c1) 9 board[row][col] = c2; 10 else 11 return; 12 search(board, row+1, col, c1, c2); 13 search(board, row-1, col, c1, c2); 14 search(board, row, col+1, c1, c2); 15 search(board, row, col-1, c1, c2); 16 } 17 void solve(vector<vector<char>>& board) { 18 int nRow = board.size(); 19 if(nRow < 1) 20 return; 21 int nCol = board[0].size(); 22 for(int i = 0; i < nRow; i++){ 23 //寻找第一行和最后一行 24 if(board[i][0] == 'O') 25 search(board, i, 0, 'O', 'W'); 26 if(board[i][nCol-1] == 'O') 27 search(board, i, nCol-1, 'O', 'W'); 28 } 29 for(int i = 1; i < nCol-1; i++){ 30 //第一列和最后一列 31 if(board[0][i] == 'O') 32 search(board, 0, i, 'O', 'W'); 33 if(board[nRow-1][i] == 'O') 34 search(board, nRow-1, i, 'O', 'W'); 35 } 36 for(int i = 1; i < nRow-1; i++){ 37 //把二维数组中的'O'全部替换 38 for(int j = 1; j < nCol-1; j++){ 39 if(board[i][j] == 'O') 40 board[i][j] = 'X'; 41 } 42 } 43 for(int i = 0; i < nRow; i++){ 44 //第一行和最后一行重新替换 45 if(board[i][0] == 'W') 46 search(board, i, 0, 'W', 'O'); 47 if(board[i][nCol-1] == 'W') 48 search(board, i, nCol-1, 'W', 'O'); 49 } 50 for(int i = 1; i < nCol-1; i++){ 51 //第一列和最后一列 52 if(board[0][i] == 'W') 53 search(board, 0, i, 'W', 'O'); 54 if(board[nRow-1][i] == 'W') 55 search(board, nRow-1, i, 'W', 'O'); 56 } 57 } 58 };