题目要求:
在一个二维平面上有至少被'0'或者'X'填满,要求当‘O’被'X包围时:除非'O'就在边界或者'O'临近的'O'也在边界,否则将被‘P’代替即只有在边界由‘O’连成的片区不会被改变为‘X’,其余位置的‘O’均会被改为‘X’;所以依次从每行的左右边界,每列的上下边界出发,检查元素,对于不能由‘O’改为‘X’的位置标记为'P';'
这里对边界处只要是'O'的采用BFS遍历,遍历完成后所有靠近边界的‘O’将被设置为'P',并最终还原'O':
例如
X X X X X O O X X X O X X O X X完成函数后:
X X X X X X X X X X X X X O X X
X X X X X X O X X O X X X O X X完成函数后:
X X X X X X X X X O X X X O X X代码:
void changeo2p(vector< vector<char>>&board,int i,int j){
board[i][j]='P';
int m=board.size();
int n=board[0].size();
if(i>1&&board[i-1][j]=='O')changeo2p(board,i-1,j);
if(j>1&&board[i][j-1]=='O')changeo2p(board,i,j-1);
if(i<m-1&&board[i+1][j]=='O')changeo2p(board,i+1,j);
if(j<n-1&&board[i][j+1]=='O')changeo2p(board,i,j+1);
}
void solve(vector<vector<char>>& board) {
int m=board.size();
if(m<1)return;
int n=board[0].size();
if(n<1)return;
//0行再BFS
for(int i=0;i<n;i++)
if(board[0][i]=='O')changeo2p(board,0,i);
//0列
for(int i=0;i<m;i++)
if(board[i][0]=='O')changeo2p(board,i,0);
//m-1行
for(int i=0;i<n;i++)
if(board[m-1][i]=='O')changeo2p(board,m-1,i);
//n-1列
for(int i=0;i<m;i++)
if(board[i][n-1]=='O')changeo2p(board,i,n-1);
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
if(board[i][j]=='O')board[i][j]='X';
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(board[i][j]=='P')board[i][j]='O';
}