1. 程式人生 > 其它 >刷題-力扣-面試題 08.10. 顏色填充

刷題-力扣-面試題 08.10. 顏色填充

題目連結

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/color-fill-lcci
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題目描述

編寫函式,實現許多圖片編輯軟體都支援的「顏色填充」功能。

待填充的影象用二維陣列 image 表示,元素為初始顏色值。初始座標點的行座標為 sr 列座標為 sc。需要填充的新顏色為 newColor 。

「周圍區域」是指顏色相同且在上、下、左、右四個方向上存在相連情況的若干元素。

請用新顏色填充初始座標點的周圍區域,並返回填充後的影象。

示例:

輸入:
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] 內。
  • 初始座標點 (sr,sc) 滿足0 <= sr < image.length 和0 <= sc < image[0].length 。
  • image[i][j] 和newColor表示的顏色值在範圍[0, 65535] 內。

題目分析

  1. 根據題目描述,將相鄰切相同顏色的格子,改變顏色
  2. 廣度優先搜尋,將相鄰區域切顏色相同的位置改變顏色

程式碼

class Solution {
public:
    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int newColor) {
        if (newColor == image[sr][sc]) { return image; }
        floodFill(image, sr, sc, newColor, image[sr][sc]);
        return image;
    }

private:
    void floodFill(std::vector<std::vector<int>>& image, int sr, int sc, int newColor, int oldColor) {
        if (sr < 0 || sr >= image.size() || sc < 0 || sc >= image[sr].size()) { return; }
        if (image[sr][sc] == newColor) { return; }
        if (image[sr][sc] == oldColor) {
            image[sr][sc] = newColor;
            floodFill(image, sr - 1, sc, newColor, oldColor);
            floodFill(image, sr + 1, sc, newColor, oldColor);
            floodFill(image, sr, sc - 1, newColor, oldColor);
            floodFill(image, sr, sc + 1, newColor, oldColor);
        }
        return;
    }

};