1. 程式人生 > >leetcode 733. 圖像渲染(Flood Fill)

leetcode 733. 圖像渲染(Flood Fill)

每一個 floodfill 數值 stack turn return leet 表示圖 重復

目錄

  • 題目描述:
  • 示例 1:
  • 解法:

題目描述:

有一幅以二維整數數組表示的圖畫,每一個整數表示該圖畫的像素值大小,數值在 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.length
    0 <= sc < image[0].length
  • image[i][j]newColor 表示的顏色值在範圍 [0, 65535]內。

解法:

#define PR pair<int, int>

class Solution {
public:
    bool valid(int x, int y, int m, int n){
        return x >= 0 && x < m && y >= 0 && y < n;
    }
    
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
        int oldColor = image[sr][sc];
        int m = image.size();
        int n = image[0].size();
        if(oldColor == newColor){
            return image;
        }else{
            stack<PR> stk;
            stk.push({sr, sc});
            while(!stk.empty()){
                PR pos = stk.top();
                stk.pop();
                int x = pos.first, y = pos.second;
                for(int dx = -1; dx <= 1; dx++){
                    for(int dy = -1; dy <= 1; dy++){
                        if(dx*dy == 0){
                            int _x = dx+x, _y = dy+y;
                            if(valid(_x, _y, m, n) && image[_x][_y] == oldColor){
                                image[_x][_y] = newColor;
                                stk.push({_x, _y});
                            }
                        }
                    }
                }
            }
            return image;
        }
    }
};

leetcode 733. 圖像渲染(Flood Fill)