給出一個m*n的矩陣,求左上角到右下角的距離的最小值。
阿新 • • 發佈:2018-12-13
問題描述 這是一個商湯科技筆試題的變形,大致是給出一個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); //返回兩者中較小值 } } }