Q:
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
题意就是给你一个二维矩阵,里面包含’O’,’X’,然后把所有被’X’包围的’O’变为’X’。
solution:
因为不涉及到最少步或者最优解问题。
这道题可以有很多解法BFS,DFS,UNION FIND。
做这道题的最主要的目的是为了学习UNION FIND。
想要了解UNION FIND解法的可以参考这篇博客:
(LeetCode 130)Surrounded Regions(并查集)
不过先使用BFS解了一下,开始写了个递归版,自己运行好好的,结果submit的时候好像爆栈了,因为老是出现Runtime Error。
不得不改成迭代版的。
递归版:
class Solution {
public:
vector<vector<int>> visit;
void solve(vector<vector<char>>& board) {
if(board.size()==0||board[0].size()==0)return;
visit = vector<vector<int>>(board.size(),vector<int>(board[0].size(),0));
int count=0;
for(int i=0;i<board.size();i++)
for(int j=0;j<board[0].size();j++){
if((visit[i][j]!=0)||(board[i][j]=='X'))
continue;
count++;
// cout<<i<<" "<<j<<endl;
if(dfs(board,i,j,count)){
//cout<<count<<endl;
for(int m=0;m<board.size();m++)
for(int n=0;n<board[0].size();n++)
if(visit[m][n]==count)
board[m][n]='X';
}
}
}
bool dfs(vector<vector<char>>& board,int i,int j,int ff){
bool flag = true;
visit[i][j]=ff;
if((i==0)||(j==0)||(i==board.size()-1)||(j==board[0].size()-1))
flag=false;
for(int p=-1;p<=1;p++)
for(int q=-1;q<=1;q++){
if((p+q!=-1)&&(p+q!=1))continue;
if((i+p<0)||(j+q<0)||(i+p>=board.size())||(j+q>=board[0].size()))continue;
if(board[i+p][j+q]=='X')continue;
if(visit[i+p][j+q]!=0)continue;
visit[i+p][j+q]=ff;
flag=dfs(board,i+p,j+q,ff);
}
return flag;
}
};
迭代版:
class Solution {
public:
struct position{
int x;
int y;
position(int x,int y):x(x),y(y){};
};
vector<vector<int>> visit;
void solve(vector<vector<char>>& board) {
if(board.size()==0||board[0].size()==0)return;
visit = vector<vector<int>>(board.size(),vector<int>(board[0].size(),0));
int count=0;
for(int i=0;i<board.size();i++)
for(int j=0;j<board[0].size();j++){
if((visit[i][j]!=0)||(board[i][j]=='X'))
continue;
count++;
if(bfs(board,i,j,count)){
for(int m=i;m<board.size();m++)
for(int n=0;n<board[0].size();n++)
if(visit[m][n]==count)
board[m][n]='X';
}
}
}
bool bfs(vector<vector<char>>& board,int i,int j,int ff){
queue<position>pq;
position pos1(i,j);
visit[i][j]=ff;
bool flag = true;
if((i==0)||(j==0)||(i==board.size()-1)||(j==board[0].size()-1))
flag=false;
pq.push(pos1);
while(!pq.empty()){
position pos2 =pq.front();
pq.pop();
int i=pos2.x;
int j=pos2.y;
for(int p=-1;p<=1;p++)
for(int q=-1;q<=1;q++){
if((p+q!=-1)&&(p+q!=1))continue;
if((i+p<0)||(j+q<0)||(i+p>=board.size())||(j+q>=board[0].size()))continue;
if(board[i+p][j+q]=='X')continue;
if(visit[i+p][j+q]!=0)continue;
visit[i+p][j+q]=ff;
if((i+p==0)||(j+q==0)||(i+p==board.size()-1)||(j+q==board[0].size()-1))
flag=false;
position pos3(i+p,j+q);
pq.push(pos3);
}
}
//cout<<flag<<endl;
return flag;
}
};