1.BFS搜索被‘X’包围的区域
2.BFS填充被‘X’包围的区域
注意的是在BFS时的剪枝,当一个点被访问过后,不需要再进行访问
class Solution {
bool search(vector< vector<char> > &g,int i,int j,int h,int w, vector< vector<bool> > &v){
queue<pair<int,int> > q;
pair<int,int> pr;
q.push(make_pair(i,j));
bool ret=true;
while(!q.empty()){
pr=q.front();
q.pop();
int x=pr.first,y=pr.second;
if(v[x][y])continue; //当该点被访问过,则直接跳过
v[x][y]=true;
if(x==0||y==0||x==h-1||y==w-1){
ret=false;
}
if(x-1>=0&&!v[x-1][y]&&g[x-1][y]=='O'){
q.push(make_pair(x-1,y));
}
if(x+1<h&&!v[x+1][y]&&g[x+1][y]=='O'){
q.push(make_pair(x+1,y));
}
if(y-1>=0&&!v[x][y-1]&&g[x][y-1]=='O'){
q.push(make_pair(x,y-1));
}
if(y+1<w&&!v[x][y+1]&&g[x][y+1]=='O'){
q.push(make_pair(x,y+1));
}
}
return ret;
}
void fill(vector< vector<char> > &g,int i,int j,int h,int w){
queue<pair<int,int> > q;
pair<int,int> pr;
q.push(make_pair(i,j));
while(!q.empty()){
pr=q.front();
int x=pr.first,y=pr.second;
q.pop();
if(g[x][y]=='X')continue;//当该点被访问过,则直接跳过
g[x][y]='X';
if(g[x-1][y]=='O'){
q.push(make_pair(x-1,y));
}
if(g[x+1][y]=='O'){
q.push(make_pair(x+1,y));
}
if(g[x][y-1]=='O'){
q.push(make_pair(x,y-1));
}
if(g[x][y+1]=='O'){
q.push(make_pair(x,y+1));
}
}
}
public:
void solve(vector< vector<char> > &board) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(board.size()==0)return;
vector<char> vec=board[0];
int i,j, w=vec.size(),h=board.size();
vector< vector<bool> > v;
for(i=0;i<h;++i){
vector<bool> bv(board[i].size(),false);
v.push_back(bv);
}
for(i=0;i<h;++i){
for(j=0;j<board[i].size();++j){
if(!v[i][j]&&board[i][j]=='O'){
if(search(board,i,j,h,w,v)){
fill(board,i,j,h,w);
}
}
}
}
v.clear();
}
};