# 题目：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

# 思路：

DFS写在代码里面，但是会出现栈溢出。

BFS似乎不会，我不知道为啥，只是能够成功。

# 代码：

class Solution {
public:
/*
void solve(vector<vector<char>>& board) {
if(board.empty()||board[0].empty()) return;
int i=0,j=0;
int m=board.size(),n=board[0].size();

for(;j<n-1;j++){
walk(board,i,j);
}

for(;i<m-1;i++){        //right
walk(board,i,j);
}

for(;j>0;j--){          //down
walk(board,i,j);
}

for(;i>0;i--){//left
walk(board,i,j);
}

for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(board[i][j]=='#') board[i][j]='O';
else    board[i][j]='X';
}
}
}

void walk(vector<vector<char> >&board,int i,int j){
//DFS
if(i<0||i>=board.size()||j<0||j>=board[0].size())   return;
if(board[i][j]=='O'){
board[i][j]='#';
walk(board,i-1,j);
walk(board,i+1,j);
walk(board,i,j-1);
walk(board,i,j+1);
}
}*/

void bfs(int i, int j, vector<vector<char>>& board) {
int n = board.size();
int m = board[0].size();
queue<pair<int, int>> q;
q.push(make_pair(i, j));
while (!q.empty()) {
auto top = q.front();
q.pop();
if (top.first >= 0 && top.first < n && top.second >= 0 && top.second < m && board[top.first][top.second] == 'O') {
//如果没有这句话，那么你接下来的make_pair就会出错，溢出.
board[top.first][top.second] = '#';
q.push(make_pair(top.first - 1, top.second));
q.push(make_pair(top.first + 1, top.second));
q.push(make_pair(top.first, top.second + 1));
q.push(make_pair(top.first, top.second - 1));
}
}
}

void solve(vector<vector<char>>& board) {
if(board.empty()||board[0].empty()) return;
int m=board.size(),n=board[0].size();

for(int i=0;i<m;i++){
//最左边与最右边
if(board[i][0]=='O')    walk( board,i,0);
if(board[i][n-1]=='O')  walk( board,i,n-1);
}

for(int i=1;i<n-1;i++){
//最上边与最下边
if(board[0][i]=='O')    walk( board,0,i);
if(board[m-1][i]=='O')  walk( board,m-1,i);
}

for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(board[i][j]=='#')    board[i][j]='O';
else    board[i][j]='X';
}
}
}

void walk(vector<vector<char>>& board,int i,int j){
int m=board.size(),n=board[0].size();
queue<pair<int,int>>q;
q.push(make_pair(i,j));
while(!q.empty()){
auto tem=q.front();
q.pop();
if(tem.first>=0&&tem.first<m&&tem.second>=0&&tem.second<=n&&board[tem.first][tem.second]=='O'){
board[tem.first][tem.second]='#';
q.push(make_pair(tem.first-1,tem.second));
q.push(make_pair(tem.first+1,tem.second));
q.push(make_pair(tem.first,tem.second-1));
q.push(make_pair(tem.first,tem.second+1));
}
}
}
};


• 本文已收录于以下专栏：

## Leetcode Surrounded Regions 解题报告

http://oj.leetcode.com/problems/surrounded-regions/ Given a 2D board containing 'X' and 'O', captur...
• worldwindjp
• 2014年02月15日 20:57
• 4588

## [leetcode-130]Surrounded Regions(java)

• zdavb
• 2015年08月12日 20:39
• 883

## 130 Surrounded Regions

• ChilseaSai
• 2015年12月21日 22:43
• 1003

## Surrounded Regions -- LeetCode

• linhuanmars
• 2014年04月04日 01:12
• 15004

## (LeetCode 130)Surrounded Regions(并查集)

Q: Given a 2D board containing ‘X’ and ‘O’, capture all regions surrounded by ‘X’.A region is captu...
• u014616233
• 2016年04月20日 22:07
• 1693

## LeetCode（130） Surrounded Regions

• fly_yr
• 2016年08月15日 22:04
• 1048

## (LeetCode 130) Surrounded Regions(BFS)

Q: Given a 2D board containing ‘X’ and ‘O’, capture all regions surrounded by ‘X’.A region is captu...
• u014616233
• 2016年04月20日 16:45
• 713

## LeetCode_Surrounded Regions

130. Surrounded Regions一、题目描述题目输入一个X O的矩阵，输出要求被 X 包围的 O 都变成 X。二、解题思路这里说下我的思路，看到这道题我先意识到的是边上的 O 都是不变的...
• glDemo
• 2015年08月22日 04:57
• 952

## [leetcode] 130. Surrounded Regions 解题报告

• qq508618087
• 2016年01月30日 16:17
• 907

## leetcode_question_130 Surrounded Regions

Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captur...
• doc_sgl
• 2013年09月19日 23:54
• 5119

举报原因： 您举报文章：Surrounded Regions 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)