題目描述:網絡
給定一個二維網絡,給定任意起點與終點。每一步能夠往4個方向走。要找出黃金最多的一條線路。spa
很明顯的是要「一條路走到黑,一直下去直到某個條件中止」。code
運用dfs(深度優先搜索)求解。blog
由於起點任意,因此從每一個點開始搜,接着每一個點又搜相鄰點。反覆如此。遞歸
遞歸的終止條件:get
1:越界。io
2:搜到已經走過的點也終止。class
3:遇到黃金數量爲0的點。變量
用一個形參變量sum存儲每條線路的當前黃金數量。搜索
每一次更新返回值res的值。
搜一個點先將其標記,再搜其4個方向相鄰點,搜完相鄰點後取消原標記。
解題代碼:
1 class Solution { 2 public int res = -10000000; 3 public int max = 0 ; 4 public boolean[][] vis = new boolean[20][20]; 5 public int getMaximumGold(int[][] grid) { 6 for(int i = 0 ; i < grid.length;i++){ 7 for(int j = 0 ;j < grid[0].length;j++){ 8 dfs(grid,i,j,0); 9 } 10 } 11 return res; 12 } 13 public void dfs(int[][] grid,int i,int j,int sum){ 14 15 if(i<0||j<0||i>=grid.length||j>=grid[0].length||grid[i][j] == 0 || vis[i][j] ){ // 遞歸終止條件 16 return ; 17 } 18 vis[i][j] = true; // 標記 19 sum += grid[i][j]; // 更新返回值 20 res = Math.max(sum,res); 21 dfs(grid,i-1,j,sum); 22 dfs(grid,i,j-1,sum); 23 dfs(grid,i+1,j,sum); 24 dfs(grid,i,j+1,sum); 25 vis[i][j] = false; // 取消標記 26 27 } 28 }