1. 题⽬链接:733.图像渲染
2. 题⽬描述:
3. 算法思路:
可以利⽤「深搜」或者「宽搜」,遍历到与该点相连的所有「像素相同的点」,然后将其修改成指定 的像素即可。
递归函数设计:
• 参数:
a. 原始矩阵;
b. 当前所在的位置;
c. 需要修改成的颜⾊。
• 函数体:
a. 先将该位置的颜⾊改成指定颜⾊(因为我们的判断,保证每次进⼊递归的位置都是需要修改的 位置);
b. 遍历四个⽅向上的位置:
▪ 如果当前位置合法,并且与初试颜⾊相同,就递归进去。
C++算法代码:
class Solution
{
public:
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
int key; //目标值
int new_key; //修改后的值
void dfs(vector<vector<int>>& image,int x,int y)
{
for (int i = 0; i < 4; i++)
{
int X = x + dx[i], Y = y + dy[i];
//合法性判断
if (X < 0 || X >= image.size() || Y < 0 || Y >= image[0].size() || image[X][Y] !=key)
{
continue;
}
//修改值
image[X][Y]=new_key;
dfs(image, X, Y);
}
}
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color)
{
//如果初始点的值等于要修改的值,则不用修改直接返回答案
if(image[sr][sc] == color)
{
return image;
}
key=image[sr][sc];
new_key=color;
image[sr][sc]=color;
dfs(image,sr,sc);
return image;
}
};
Java算法代码:
class Solution
{
int[] dx = { 0, 0, 1, -1 };
int[] dy = { 1, -1, 0, 0 };
int m, n;
int prev;
public int[][] floodFill(int[][] image, int sr, int sc, int color)
{
if (image[sr][sc] == color) return image;
m = image.length; n = image[0].length;
prev = image[sr][sc];
dfs(image, sr, sc, color);
return image;
}
public void dfs(int[][] image, int i, int j, int color)
{
image[i][j] = color;
for (int k = 0; k < 4; k++)
{
int x = i + dx[k], y = j + dy[k];
if (x >= 0 && x < m && y >= 0 && y < n && image[x][y] == prev)
{
dfs(image, x, y, color);
}
}
}
}
标签:递归,渲染,int,sr,image,color,算法,key,sc
From: https://blog.csdn.net/2301_79580018/article/details/141039088