2012-12-20 44 views
-1

我試圖在特定問題上應用洪水填充。我很難理解如何用一個幫助函數創建一個變量,所以我在整個遞歸過程中都保留它。
我已經看到有一個關於它的線程,雖然我不知道如何將它應用於我自己的使用。在遞歸中使用相同的變量

這是我寫到目前爲止代碼:

如何創建k個變量保持不變?

public static int[][] fill(int[][] map, int i, int j, int color) { 
    int[][] ans = null; 

     if ((i<map.length)&&(i>0)&&(j<map.length)&&(j>0)) 
      { 
      if ((k!=map[i][j])) 

        { 
         map[i][j]=color;  
        } 
      } 
     fill(map,i-1,j,color); 
     fill(map,i+1,j,color); 
     fill(map,i,j-1,color); 
     fill(map,i,j+1,color); 
    return ans; 
} 

public static void fill(int[][] map, int i, int j, int color,int k) 

k=map[i][j] 

可以說這是我的數組:

4,1,2,2
4,4,3,1
1,4,4,4

1,4 ,0,2

我希望洪泛所有的索引值爲4. 我希望k獲得4的值,所以我可以用k來比較每個索引。

+1

'k'定義在哪裏?請張貼一些編譯的代碼,最好是[SSCCE](http://sscce.org/)。 –

+0

我不知道你的需求(也許你可以更好地解釋),但是如果你想要一個變量可用於一個函數的所有遞歸調用,那意味着你需要一個額外的參數。 – fegemo

+0

你在說什麼?這是StackOverflow的另一個問題嗎? –

回答

0

我מ另外你的問題我注意到,你的函數不會工作,因爲你boundries檢查,你是否行或山坳等於板的長度,這樣很好,但你需要將其更改爲<,而不是< =。反正你可以使用你的代碼,這樣的:

public static int[][] fill(int[][] map, int i, int j, int color) { 

    int origColor = map[i][j]; 
    fill(map, i, j, color, origColor); 


    return map; 

    } 

private static void fill(int[][] map, int i, int j,int color, int origColor) { 



    //checks if index is inside matrix and if the index is equal to original number. 

    if ((i<map.length)&&(i>=0)&&(j<map.length)&&(j>=0)&&(origColor==map[i][j])) 

    { 

    map[i][j]=color; 



    //recursive call for north east west south. 

    fill(map,i-1,j,color,origColor); 

    fill(map,i+1,j,color,origColor); 

    fill(map,i,j-1,color,origColor); 

    fill(map,i,j+1,color,origColor); 
    } 


    } 
public static void printBoard(int[][] board) { 
if (board == null) 
    System.out.println("null"); 
else for (int i=0; i<board.length; i++) { 
    if (board[i] == null) 
     System.out.println("null"); 
    else 
     for (int j=0; j<board[i].length; j++) 
      System.out.print(board[i][j]); 
    System.out.println(); 
} 
} 

的檢查:

fill(map,1,1,9); 
    printBoard(map); 

祝您好運!

0

您將使用獲取k值的新函數(我在示例中將其稱爲origColor),然後將它傳遞給需要它的函數。使用k的函數不需要從外部可見,除非您也想要,所以我在下面將它私有。

public static void fill(int[][] map, int i, int j, int color) { 
    int origColor = map[i][j]; 
    fill(map, i, j, color, origColor); 
} 

private static void fill(int[][] map, int i, int j, int color, int origColor) { 
    // actual fill method with recursive calls. 
} 
+0

我明白了,但我還是不太明白哪個函數首先運行?我通過幫助功能調用主函數?? –

+0

非常感謝。 –