1. 程式人生 > 其它 >影象渲染

影象渲染

https://leetcode-cn.com/problems/flood-fill/

733. 影象渲染

有一幅以二維整數陣列表示的圖畫,每一個整數表示該圖畫的畫素值大小,數值在 0 到 65535 之間。

給你一個座標(sr, sc)表示影象渲染開始的畫素值(行 ,列)和一個新的顏色值newColor,讓你重新上色這幅影象。

為了完成上色工作,從初始座標開始,記錄初始座標的上下左右四個方向上畫素值與初始座標相同的相連畫素點,接著再記錄這四個方向上符合條件的畫素點與他們對應四個方向上畫素值與初始座標相同的相連畫素點,……,重複該過程。將所有有記錄的畫素點的顏色值改為新的顏色值。

最後返回經過上色渲染後的影象。

示例 1:

輸入: 
image = [[1,1,1],[1,1,0],[1,0,1]]
sr = 1, sc = 1, newColor = 2
輸出: [[2,2,2],[2,2,0],[2,0,1]]
解析: 
在影象的正中間,(座標(sr,sc)=(1,1)),
在路徑上所有符合條件的畫素點的顏色都被更改成2。
注意,右下角的畫素沒有更改為2,
因為它不是在上下左右四個方向上與初始點相連的畫素點。

注意:

  • imageimage[0]的長度在範圍[1, 50]內。
  • 給出的初始點將滿足0 <= sr < image.length0 <= sc < image[0].length
  • image[i][j]newColor表示的顏色值在範圍[0, 65535]內。

演算法思路:

深度優先遍歷

1.未發現節點前,為白色

2.發現節點時,標記為灰色

3.遍歷到該節點時,塗為黑色

4.回溯現場時,重新標記為白色。

問題思路:

本題染色後無需回退,因此進行到第三步即可。

class Solution {
public:
    bool map_[55][55];
    int move_[5][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
    void dfs(vector<vector<int>>& image, int
x, int y, int num){ int rows = image.size(); int cols = image[0].size(); for(int i=0; i<4; i++){ int x_ = x+move_[i][0]; int y_ = y+move_[i][1]; if(x_>=0 && y_>=0 && y_<cols && x_<rows && !map_[x_][y_] && image[x_][y_]==image[x][y]){ // cout<<x_<<" "<<y_<<endl; map_[x_][y_] = 1; dfs(image, x_, y_, num); image[x_][y_] = num; } } return; } vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) { dfs(image, sr, sc, newColor); image[sr][sc] = newColor; return image; } };