1. 程式人生 > 實用技巧 >733.影象渲染

733.影象渲染

題目描述

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

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

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

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

題解

此題可以很容易想到要用BFS方法進行遞迴。

BFS方法套路:

  1. 首先判斷當前節點是否滿足條件,如果不滿足就return
  2. 否則,當前節點滿足條件,那麼對當前節點進行操作。

題目要求所有座標的原畫素都必須等於初始點的畫素,不妨設preColor=image[sr][sc]。下面分析一下什麼條件下當前節點不滿足:

  1. sr<0||sr>image.length
  2. sc<0||sc>image[0].length
  3. image[sr][sc]==newColor //說明當前節點已經訪問過,防止重複訪問,否則遞迴出不來
  4. image[sr][sc]!=preColor //所有節點的原畫素都需要和preColor相等
class Solution {
    void bfs(int[][] image,int x,int y,int newColor,int preColor){
        //首先判斷當前節點是否滿足條件,不滿足條件的退出
        if(x<0||x>=image.length||y<0||y>=image[0].length||image[x][y]==newColor||image[x][y]!=preColor)
            return;
        //如果滿足條件,就遍歷當前節點的上下左右四個節點
        else{
            image[x][y]=newColor;
            bfs(image,x-1,y,newColor,preColor);
            bfs(image,x+1,y,newColor,preColor);
            bfs(image,x,y-1,newColor,preColor);
            bfs(image,x,y+1,newColor,preColor);
        }
        
    }
    public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
        bfs(image,sr,sc,newColor,image[sr][sc]);
        return image;
    }
}

題目連結