解題心得
從邊緣的 O 往內走訪,最後再回頭重新檢視誰要被翻過去。
程式碼
class Solution {
public:
void helper(vector<vector<char>>& board, vector<vector<bool>>& notFlip, int x, int y)
{
if(x < 0 || y < 0 || x >= board.size() || y >= board[0].size())
return;
if(board[x][y] == 'X' || notFlip[x][y])
return;
int dx[4] = {-1, 0, 0, 1}, dy[4] = {0, -1, 1, 0};
notFlip[x][y] = true;
for(int i=0; i<4; i++)
{
helper(board, notFlip, x+dx[i], y+dy[i]);
}
}
void solve(vector<vector<char>>& board) {
vector<vector<bool>> notFlip(board.size(), vector<bool>(board[0].size(), false));
for(int i=0; i<board.size(); i++)
{
for(int j=0; j<board[0].size(); j++)
{
if(board[i][j] == 'O' && (i == 0 || i == board.size() - 1 || j == 0 || j == board[0].size() - 1))
{
helper(board, notFlip, i, j);
}
}
}
for(int i=0; i<board.size(); i++)
{
for(int j=0; j<board[0].size(); j++)
{
if(board[i][j] == 'O' && !notFlip[i][j])
board[i][j] = 'X';
}
}
}
};
沒有留言:
張貼留言