演算法-深度優先遍歷(影象渲染)
阿新 • • 發佈:2022-04-14
733. 影象渲染
有一幅以 m x n
的二維整數陣列表示的圖畫 image
,其中 image[i][j]
表示該圖畫的畫素值大小。
你也被給予三個整數 sr
, sc
和 newColor
。你應該從畫素 image[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,因為它不是在上下左右四個方向上與初始點相連的畫素點。
示例 2:
輸入: image = [[0,0,0],[0,0,0]], sr = 0, sc = 0, newColor = 2 輸出: [[2,2,2],[2,2,2]]
1
//這兩個陣列可以實現上下左右移動
const intdx[4] = {1,0,0,-1}; 2 const int dy[4] = {0,1,-1,0}; 3 int n; 4 int m; 5 void dfs(int **imag,int x,int y,int color,int newcolor){ 6 int mx,my,i; 7 if(imag[x][y]==color) 8 {imag[x][y] = newcolor;//相當於if (visit【x】【y】==0)visit【x】【y】= 1; 9 for(i = 0;i<4;i++) 10 { mx = x+dx[i]; 11 my = y+dy[i];12 if(mx>=0&&mx<n&&my>=0&&my<m)//my要小於m 13 dfs(imag,mx,my,color,newcolor);//運用遞迴實現dfs 14 } 15 }} 16 int** floodFill(int** image, int imageSize, int* imageColSize, int sr, int sc, int newColor, 17 int* returnSize, int** returnColumnSizes){ 18 n = imageSize, m = imageColSize[0]; 19 *returnSize = n; 20 *returnColumnSizes = malloc ( sizeof ( int ) * n );//如果不開闢空間將會出錯 21 for (int i = 0; i < n; i++) { 22 (*returnColumnSizes)[i] = m; 23 } 24 int currColor = image[sr][sc]; 25 if (currColor != newColor) { 26 dfs(image, sr, sc, currColor, newColor); 27 } 28 return image; 29 }
深度優先遍歷的步驟我大致已經理解了 但還是不明白imagecolsize和returncolumnsize是幹嘛用的