package 数阵中的最优路径; import java.util.Scanner; public class Main2 { /** * 数阵中的最小路径搜索 * 1:设计要点 * 应用动态规划设计从右下角逐行至左上角,确定n,m后,随机产生的整数二维数组a(n,m)作矩阵输出同时赋值给部分和数组b(n,m). * 数组b(i,j)为点(i,j)到到右下角的最小数值和stm(i,j)是点(i,j)向右(R)或向下(D)或向右下(0)的路标数组 * 注意到最后一行与最后一列各数只有一个出口,于是b[n][m]开始向左逐个推出同行的b[n][j](j=m-1,.....1);想上逐个推出同列 * b(i,m)(i = n-1,......1); * b(i,j)与stm(i,j)的值,由同一列下面的值b(i+1,j),与同一行右边的值b(i,j+1),其右下方的值b(i+1,j+1)值决定。 * 设min = min(b(i+1,j+1),b(i+1,j),b(i,j+1)) * 首先作赋值min=b(i+1,j+1),stm(i,j) = "0" * 如果b(i,j+1)<min,则min=b(i,j+1);stm(i,j) = "R" * 如果b(i+1,j)<min,则min=b(i+1,j);stm(i,j) = "D" * 然后赋值b(i,j) = b(i,j)+min. * * * * * * @param args */ public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("输入行数:"); int n = input.nextInt(); System.out.println("输入列数:"); int m = input.nextInt(); int a[][] = new int[30][30]; int b[][] = new int[30][30]; char[][]stm = new char[30][30]; //输出矩阵 for(int i=1;i<=n;i++) { for(int j = 1;j<=m;j++) { a[i][j] = (int)(Math.random()*20+1); b[i][j] = a[i][j]; System.out.printf("%4d",a[i][j]); } System.out.println(); } //计算最小路径 for(int j = m-1;j>=1;j--)//第n行递推为边界条件 { b[n][j]+=b[n][j+1]; stm[n][j]=‘R‘; } for(int i = n-1;i>=1;i--)//第m列递推为边界条件 { b[i][m]+=b[i+1][m]; stm[i][m]=‘D‘; } //逆推求取最小值 for(int i=n-1;i>=1;i--) for(int j = m-1;j>=1;j--) { int min = b[i+1][j+1]; stm[i][j] = ‘0‘; if(min > b[i+1][j]) { min = b[i+1][j]; stm[i][j]=‘D‘; } if(min > b[i][j+1]) { min = b[i][j+1]; stm[i][j] = ‘R‘; } b[i][j]+=min; } System.out.println(b[1][1]); } }
时间: 2024-10-28 16:33:16