1. 程式人生 > >回溯法計算二維數組最短路徑

回溯法計算二維數組最短路徑

搜索 trace 回退 輸入 lse var brush pop slice

提供的二維數字矩陣地圖,從左上角出發,每次可以向下或向右走,直到到達右下角,途中經過的路徑上的數字加起來,得到的數應該是一個最大的數
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);
			}
		}
	}

  

回溯法計算二維數組最短路徑