This is my solution, which receives a heap buffer overflow (out of bounds):
void FFHelper(vector<vector<int>>& image, int i, int j, int newColor, int oldColor)
{
static int m = image.size();
static int n = image[0].size();
if (i < 0 || j < 0
|| i >= m || j >= n
|| image[i][j] != oldColor)
{
return;
}
image[i][j] = newColor;
FFHelper(image, i+1, j, newColor, oldColor);
FFHelper(image, i-1, j, newColor, oldColor);
FFHelper(image, i, j+1, newColor, oldColor);
FFHelper(image, i, j-1, newColor, oldColor);
}
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color)
{
FFHelper(image, sr, sc, color, image[sr][sc]);
return image;
}
where it is guaranteed that 0 <= sr < m
and 0 <= sc < n
where image
is m x n
.
This is a code that receives no buffer overflow:
void dfs(vector<vector<int>>& image, int i, int j, int val, int newColor)
{
if(i < 0 || i >= image.size()
|| j < 0 || j>= image[0].size()
|| image[i][j] == newColor || image[i][j] != val)
{
return;
}
image[i][j] = newColor;
dfs(image, i - 1, j, val, newColor);
dfs(image, i + 1, j, val, newColor);
dfs(image, i, j - 1, val, newColor);
dfs(image, i, j + 1, val, newColor);
}
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc,
int newColor)
{
int val = image[sr][sc];
dfs(image, sr, sc, val, newColor);
return image;
}
What is the difference? I seriously don't see it. Someone from codereview.stackexchange
suggested I post here.