1. 程式人生 > >給出一個m*n的矩陣,求左上角到右下角的距離的最小值。

給出一個m*n的矩陣,求左上角到右下角的距離的最小值。

問題描述 這是一個商湯科技筆試題的變形,大致是給出一個m*n的矩陣,矩陣裡的數代表其他相鄰格到此格的距離,且只能向右和向下走,求左上角到右下角的距離的最小值。 例: 0 1 9 3 5 2 6 8 7 這個例子的最短距離是0-1-5-2-7,結果是15。 這個真的是想了一天,然後同學說用樹做,我試了一下遞迴,沒想到好像結果是正確的,真是意外,程式碼不長但是理解起來有點點難度(畢竟自己不常用遞迴)

class Distance{
int[][] mynum;
int x,y;
public Distance(int[][] mynum,int x,int y){
	this.mynum = mynum;
	this.x = x;
	this.y = y;               //傳入矩陣和矩陣大小的x,y值
}

public int Minnumber(int xx,int yy){
	
	int minright;           
	    //定義minright為當前格到右下角格的最短距離
	int minbottom;       
	  //定義minright為當前格到右下角格的最短距離
	if(xx == x-1&&yy == y-1)
		return mynum[x-1][y-1];
	//如果已經是右下角格,則返回該格的值	
	else if(xx == x-1)
		return Minnumber(xx,yy+1) + mynum[xx][yy];	
		//否則,如果是最底一排格,返回該格的值與下一格到右下角格最短值之和	 
	else if(yy==y-1)
		return Minnumber(xx+1,yy) + mynum[xx][yy];
		//否則,如果是最右一排格,返回該格的值與下一格到右下角格最短值之和
	else
	{
    minright = Minnumber(xx+1,yy) + mynum[xx][yy];
    //計算右一格到右下角格的最小距離
    minbottom = Minnumber(xx,yy+1) + mynum[xx][yy];
    //計算下一格到右下角格的最小距離
    return Math.min(minright,minbottom);
    //返回兩者中較小值
	}
   }
} 

執行結果