给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。

import java.util.Scanner;


public class Main{
        // 用于存储矩阵信息
        public  int [][] map;
        
            
        public int getShortRoute(int[][] map) {
            // 矩阵的高
            int heigh = map.length;
            // 矩阵的宽
            int with = map[0].length;
            
            // 临时矩阵,用于存储0,0到该点的最短距离
            int[][] temp = new int[heigh][with];
            
            
            // 两层for循环,用于填满二维数组
            for(int i=0; i                 for(int j=0; j                     
                    // 如果是初始点0, 0
                    if(i==0 && j==0) {
                        temp[i][j] = map[i][j];
                    }
                    
                    // 如果是最左边的一列,那么只能由上向下到达
                    else if(i==0 && j > 0) {
                        temp[i][j] = temp[i][j-1] + map[i][j];
                    }
                    
                    // 如果是最上一行,那么只能由最左往右到达
                    else if(i > 0 && j==0) {
                        temp[i][j] = temp[i-1][j] + map[i][j];
                    }
                    
                    // 其他情况,比较是向下到达距离最短,还是从左往右距离最短
                    // 将改点设置为最短的距离
                    else {
                        int goDown = temp[i][j-1] + map[i][j];
                        int goRight = temp[i-1][j] + map[i][j];
                        temp[i][j] = goDown > goRight ? goRight: goDown;
                    }
                }
                
            }
            
            // 返回终点最终叠加距离
            return temp[heigh-1][with-1];
            
        }
        
        
        
        // 用于接收OJ数据,算法实现在上部,如自己设置矩阵,可删除
        public void init(){
            Scanner scan = new Scanner(System.in);
            String[] heighWith = scan.nextLine().split(" ");
            int heigh = Integer.valueOf(heighWith[0]);
            int with = Integer.valueOf(heighWith[1]);
            this.map = new int[heigh][with];
            for(int i=0; i                 String[] temp = scan.nextLine().split(" ");
                for(int j=0; j                    map[i][j] = Integer.valueOf(temp[j]);
                }
            }
            scan.close();
        }
        
        public static void main(String[] args) {
            Main find = new Main();
            find.init();
            System.out.println(find.getShortRoute(find.map));
        }
}

你可能感兴趣的:(OJ)