这个问题有那么点感觉,但是就是不对路,开始想的是从左上角到右下角,若其左和上都是‘X'就将其改为’X‘,然后再从右下往上反,将“误杀”的还原回来,当然这要借助复制的一份board,但最终结果还是不对,因为有出现“弯路”的时候就不行了,后来想着再从右上到左下也如此操作一番,最终是没能得逞。几天无果,看了下discuss区,顿感醍醐灌顶,再看这个题,就 是呵呵。
思路是从外围是’O'的开始深度往里走,这时候里面的‘O'就有两种命运,一种是跟外围的’O'是联通的,那么这些‘O'就可以存活,剩下的孤立的’O'就没办法了,就只能被‘X'了,为了区分这两种’O',我们把联通 的‘O'改为另外一种统一而独立的字符,便于后期做恢复。这就是三步走(或两步)。
1)首先从外围的‘O'处深度搜索,见到链接的’O'就把他们都改为其他标识。
2)将剩余的孤立的’O'改为‘X',同时,将遇到标识符改为’O'。
简单吧,简单的一塌糊涂,但是这种思路太精髓了。
详细参考见:http://discuss.leetcode.com/questions/1223/surrounded-regions
http://blog.sina.com.cn/s/blog_b9285de20101j1dt.html
class Solution {
private:
int rows;
int cols;
public:
void dfs(int row, int col,vector<vector<char> >& board)
{
if(row < 0 || row >= rows || col < 0 || col >= cols) return;
if(board[row][col] != 'O') return;
board[row][col] = '+';
dfs(row - 1, col, board);//up
dfs(row, col + 1, board);//right
dfs(row + 1, col, board);//down
dfs(row, col - 1, board);//left
}
void solve(vector<vector<char> > &board)
{
if(board.size() == 0 || board[0].size() == 0)
return;
rows = board.size();
cols = board[0].size();
for(int i = 0; i < rows; ++i){
dfs(i, 0, board);
dfs(i, cols - 1, board);
}
for (int j = 0; j < cols; ++j)
{
dfs(0, j, board);
dfs(rows - 1, j, board);
}
for(int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
{
if(board[i][j] == 'O')
board[i][j] = 'X';
else if(board[i][j] == '+')
board[i][j] = 'O';
}
}
};