1. 程式人生 > >leetcode 影象渲染

leetcode 影象渲染

題目描述:

有一幅以二維整數陣列表示的圖畫,每一個整數表示該圖畫的畫素值大小,數值在 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,
因為它不是在上下左右四個方向上與初始點相連的畫素點。

注意:

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

 解題思路:

C++程式碼:

class Solution {
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
        vector<vector<int>> new_image(image);
        int oldColor = image[sr][sc]; // 例子:oldColor = 1
        if (oldColor != newColor) {  // 新的顏色不同於舊顏色才更新
            DFS(new_image, sr, sc, oldColor, newColor);  // 多傳入一個oldColor,其他位置與舊顏色相同(都是1)才更新
        }
        return new_image;
    }
private:
    void DFS(vector<vector<int>> &new_image, int r, int c, int old_color, int new_color) {
        int row_num = new_image.size(), col_num = new_image[0].size();
        
        // 越界,或者顏色不相等返回,例子:old_color = 1, 只更新位置color = 1的地方
        if (r < 0 || r >= row_num || c < 0 || c >= col_num || new_image[r][c] != old_color) { // 先判斷是否越界,不然後面會越界
            return;
        }
        new_image[r][c] = new_color;
        
        DFS(new_image, r - 1, c, old_color, new_color);
        DFS(new_image, r + 1, c, old_color, new_color);
        DFS(new_image, r, c - 1, old_color, new_color);
        DFS(new_image, r, c + 1, old_color, new_color);
    }
};