方法一:思路:遍历二维数组把每一个grid[i][j]='O'并且可以由dfs()检测是否可以修改。这种方法太费时间了。
#include<iostream>
#include<vector>
using namespace std;
vector<vector<char>> grid;
int b[4][4] = {
{-1,0},
{0,1},
{1,0},
{-1,0}
};
int m, n;
class solution
{
vector<vector<bool>>visit;
public:
void test()
{
m = grid.size();
n = grid[0].size();
visit = vector<vector<bool>>(m, vector < bool >(n, false));
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (grid[i][j]=='O'&&dfs(i, j))
grid[i][j] = 'X';
}
private:
bool dfs(int x, int y)
{
if (x < 0 || x >= m || y < 0 || y >= n)
return false;
if (grid[x][y] == 'X')
return true;
bool res=true;
for (int i = 0; i < 4; i++)
{
int newx, newy;
newx = x + b[i][0];
newy = y + b[i][1];
if (!visit[newx][newy]&&grid[newx][newy] == 'O')
{
visit[x][y] = true;
res=res&dfs(newx, newy);
visit[x][y] = false;
}
else if(!visit[newx][newy])
res &= dfs(newx, newy);
}
return res;
}
};
方法二:思路:可以只遍历二维数组的最外圈,遇到‘O’就dfs把连通块都标记起来,没有标记的都改为X
#include<iostream>
#include<vector>
using namespace std;
vector<vector<char>> grid;
int b[4][4] = {
{-1,0},
{0,1},
{1,0},
{0,-1}
};
int m, n;
class solution
{
vector<vector<bool>>visit;
public:
void test()
{
m = grid.size();
n = grid[0].size();
visit = vector<vector<bool>>(m, vector < bool >(n, false));
for (int i = 1; i < m-1; i++)
if (grid[i][0] == 'O' )
dfs(i, 0);
for (int i = 1; i < m - 1; i++)
if ( grid[i][n - 1]=='O')
dfs(i, n - 1);
for (int j = 0; j < n; j++)
if (grid[0][j] == 'O')
dfs(0, j);
for (int j = 0; j < n; j++)
if (grid[m - 1][j] == 'O')
dfs(m - 1, j);
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (!visit[i][j] && grid[i][j] == 'O')
grid[i][j] = 'X';
}
private:
void dfs(int x, int y)
{
if (x < 0 || x >= m || y < 0 || y >= n||grid[x][y]=='X')
return;
if(grid[x][y]=='O')
visit[x][y] = true;
for (int i = 0; i < 4; i++)
{
int nx, ny;
nx = x + b[i][0];
ny = x + b[i][1];
if(!visit[nx][ny])
dfs(nx, ny);
}
}
};