题目链接: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);
}
}
}
}
};