题目链接:https://leetcode.com/problems/surrounded-regions/
题目:
Given a 2D board containing 'X' and '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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
解题思路:
这题可以看做是图的广度遍历。虽然图的深度遍历也可以做,但是对本题而言,会超时。矩阵过大时,递归栈会变得很深。
思路是:
从矩形最外面一圈开始逐渐向里拓展。
若 O 是在矩形最外圈,它肯定不会被 X 包围,与它相连(邻)的 O 也就不可能被 X 包围,也就不会被替换,所以我们的工作主要是找出:
1. 最外圈的 O
2. 与最外圈的 O 相连的 O
3. 将上述找到的元素替换为某种标识符,代码中使用“#”
4. 最后按先行后列的顺序遍历矩形,找到没有被替换为 O 的元素,它们就是被 X 完全包围的需要被替换为 X 的元素;同时,标记为 # 的元素是没有被 X 包围的元素,此时将它们变回原来的 O
上述思路参考了大神的解法。
大神参考链接:http://blog.csdn.net/linhuanmars/article/details/22904855
代码实现:
class Solution { public: int go[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; void solve(vector<vector<char>>& board) { //board.clear(); //board[0]={'O','O','O'}; // board[1]={'O','O','O'}; //board[2]={'O','O','O'}; if(board.empty()) return ; int go[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; for(int i=0;i<=board.size()-1;i++) { bfs(board,i,0); bfs(board,i,board[0].size()-1); } for(int j=0;j<=board[0].size()-1;j++) { bfs(board,0,j); bfs(board,board.size()-1,j); } for(int i=0;i<=board.size()-1;i++) { for(int j=0;j<=board[0].size()-1;j++) { if(board[i][j]=='#') board[i][j]='O'; else if(board[i][j]=='O') board[i][j]='X'; } } return ; } void bfs(vector<vector<char>>& board,int i,int j) { if(board[i][j]!='O') return ; board[i][j]='#'; queue<int> tmp; tmp.push(i*board[0].size()+j); while(!tmp.empty()) { int x=tmp.front()/board[0].size(); int y=tmp.front()%board[0].size(); tmp.pop(); for(int i=0;i<=3;i++) { int xgo=x+go[i][0]; int ygo=y+go[i][1]; //if(xgo==1&&ygo==1) printf("111"); if(xgo>=0&&xgo<board.size()&&ygo>=0&&ygo<board[0].size()&&board[xgo][ygo]=='O') { //if(xgo==1&&ygo==1) printf("111"); board[xgo][ygo]='#'; tmp.push(xgo*board[0].size()+ygo); } } } } };