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

影象渲染--java

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

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

class Solution {
    public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
        int chushi = image[sr][sc];     //記錄初始值
        dfs(image,sr,sc,newColor,chushi);   //深度遍歷
        return image;
    }

    public void dfs(int[][] image, int x, int y, int newColor,int chushi){
        if(x<0||y<0||x>=image.length||y>=image[0].length){  //判斷出界限情況,直接結束遞迴呼叫
            return;
        }
        if(image[x][y] != chushi||image[x][y]==newColor) return;    //是否滿足與初始值相等情況,並且防止無限呼叫
        image[x][y] = newColor; //渲染新顏色
        dfs(image, x - 1, y,newColor,chushi);   //上下左右遞迴呼叫
        dfs(image, x + 1, y,newColor,chushi);   
        dfs(image, x, y - 1,newColor,chushi);   
        dfs(image, x, y + 1,newColor,chushi);   
    }
}