pro:给一个图,图包含'X'和‘O’,将图中所有的被包围的'O'置为‘X’,被包围的意思是周围都是'X',没有到边界。
sol:有两个做法
做法1:从每一个没被访问过的'O'开始,bfs或dfs,记录下这次有没有通过某个‘O’到达了边界,有的话就是不能置为'X'的,没有的话就能
做法2:逆向思维,从矩阵的四边找,扩展所有能扩展的'O'.剩下的就是被包围的
此题网页1A,awesome!
code:
class Solution {
public:
bool isOK(int x,int y,int n,int m,vector< vector<bool> > &used,vector< vector<char> > &board)
{
if(x>=0&&x<n&&y>=0&&y<m&&used[x][y]==false&&board[x][y]=='O')
return true;
else return false;
}
void bfs(vector< vector<bool> > &used,vector< vector<char> > &board,int x,int y)
{
int i,j,n,m;
n = board.size(),m=board[0].size();
queue<int> xque,yque;
while(!xque.empty())
xque.pop();
while(!yque.empty())
yque.pop();
xque.push(x),yque.push(y);
used[x][y]=true;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int frontx,fronty,tempx,tempy,t;
while(!xque.empty())
{
frontx = xque.front();
fronty = yque.front();
xque.pop(),yque.pop();
for(t=0;t<4;t++)
{
tempx = frontx+dir[t][0];
tempy = fronty+dir[t][1];
if(isOK(tempx,tempy,n,m,used,board))
{
used[tempx][tempy] = true;
xque.push(tempx),yque.push(tempy);
}
}
}
}
void solve(vector<vector<char>> &board) {
int i,j,n,m;
n = board.size();
if(n==0) return;
m = board[0].size();
if(m==0) return;
vector< vector<bool> > used(n,vector<bool>(m,false));
for(i=0;i<n;i++)
{
if(board[i][0]=='O'&&used[i][0]==false)
bfs(used,board,i,0);
if(board[i][m-1]=='O'&&used[i][m-1]==false)
bfs(used,board,i,m-1);
}
for(i=0;i<m;i++)
{
if(board[0][i]=='O'&&used[0][i]==false)
bfs(used,board,0,i);
if(board[n-1][i]=='O'&&used[n-1][i]==false)
bfs(used,board,n-1,i);
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(board[i][j]=='O'&&used[i][j]==false)
board[i][j]='X';
}
}
}
};