回溯法計算二維陣列最短路徑
阿新 • • 發佈:2018-12-28
提供的二維數字矩陣地圖,從左上角出發,每次可以向下或向右走,直到到達右下角,途中經過的路徑上的數字加起來,得到的數應該是一個最大的數
1.輸出路徑及累計值
2.提供二維陣列的輸入(文字檔案匯入或JS檔案匯入)
3.輸出每次搜尋花的時間,比如:輸入二維陣列 輸出結果 和 搜尋用的時間
4.最大二維陣列為:200x200,最小二維陣列為2x2;
【題目描述】
1.例如,文字檔案中內容如下:(如果採用JS編寫,陣列可以放到JS檔案中)
二維陣列:
[10, 10, 10, 10],
[1, 2, 2, 10],
[1, 2, 2, 10],
[1, 2, 3, 10],
[2, 2, 1, 10]
輸出:
最大值:80
路徑: 右 右 右 下 下 下 下
2.說明:
題目規則:二組陣列, 從座標(0,0)出發,只能向下或向右,終點為右下角
var arr = [ [10, 10, 3, 4], [1, 10, 10, 10], [1, 2, 2, 10], [1, 2, 3, 10], [2, 2, 1, 10] ]; var xm = arr.length; //x 最大值 var ym = arr[0].length; // y最大值 var bestl = 0; //記錄最優解 var r = []; //記錄最優解的路徑 var path = []; //臨時路徑 var c = 0; //臨時最優解 trace(0,0); console.log(bestl) console.log(r) function trace(x,y){ if(x < xm && y < ym){ //當還沒有到達終點時,可以繼續搜尋 c = c + arr[x][y]; //加上當前點,繼續遍歷 path.push({x:x,y:y}); //加入當前點路徑 trace(x+1,y); trace(x,y+1); c = c - arr[x][y]; //遍歷結束,回退到上級 path.pop(); //回退到上級 }else if(x >= xm-1 && y >= ym-1){ //到達終點 if(c > bestl){ //到達終點,並且比最優解還大,則記錄 bestl = c; r = path.slice(0); } } }