比较简单的dfs,思路已经在题目里讲的差不多了:
遍历矩阵四周的节点,每找到一个O,以其为起点开始dfs,将途中每一个可到达的点做标记。
在全部搜索完成后,将所有做过标记的节点变回O,将所有仍为O的节点变成X
这里记录一下今天的发现,if中的或||是按顺序执行的,若中间有一个结果是false则不会继续向下执行,如if(x>=m||x<0||y>=n||y<0||board[x][y]!=‘O’)
在这段语句中,若执行到x<0时,返回结果为false,则不会执行board[x][y]!=‘O’,也就不会出现下标溢出的情况。我感觉这知识我很可能之前在书里看到过,但完全没印象。
今天我一开始是这样写的if(board[x][y]!=‘O’||x>=m||x<0||y>=n||y<0)这样就会先执行board[x][y]!=‘O’,导致溢出,我还傻傻找了半天。
class Solution {
public:
const int dest[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int m,n;
void solve(vector<vector<char>>& board) {
if(board.size()==0||board[0].size()==0)
return;
m=board.size();n=board[0].size();
for(int i=0;i<n;i++)
{
dfs(0,i,board);
dfs(m-1,i,board);
}
for(int i=1;i<m-1;i++)
{
dfs(i,0,board);
dfs(i,n-1,board);
}
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(board[i][j]=='a')
board[i][j]='O';
else board[i][j]='X';
}
void dfs(int x,int y,vector<vector<char>>& board)
{
if(x>=m||x<0||y>=n||y<0||board[x][y]!='O')
return;
board[x][y]='a';
for(int i=0;i<4;i++)
{
dfs(x+dest[i][0],y+dest[i][1],board);
}
}
};