在二维数组中找到最小值

Posted

技术标签:

【中文标题】在二维数组中找到最小值【英文标题】:finding the lowest value in two dimensional array 【发布时间】:2019-04-18 03:13:45 【问题描述】:

程序从文件中读取 [0.0,100.0] 范围内 random doubles二维 10 x 10 数组。您的程序将找到最小值按照下面的算法将值从数组[0][0]的左上角路由到数组[9][9]的右下角:

    从 (0,0) 开始,您只能从当前位置向右或向下移动。元素 (0,1) 是你的权利。 (1,0) 处的元素是你的向下。

    找到这两个元素中的最小值并移动到那里。 “搬到那里”的意思是这将是你的新位置。

    将最小值添加到累加器。记录你的新职位。

    再次查看当前位置右侧和下方的值。

    找到这两个中的最小值并移动到那里。继续将您的最小值添加到累加器中。

    不断重复步骤 4) 和 5),直到发生以下一些情况:

    如果当前行是最后一行,则不允许再向下移动。你唯一的选择就是向右移动。

    如果您当前的列是最后一列,则不允许您再向右移动,您唯一的选择是向下。

7.如果你在最后一列和最后一行,你已经到了数组的末尾,程序结束并显示:

总累计值。-您从 (0,0) 到 (9,9) 完成的移动总数

我被困在每次以最低值打印 X 的循环中 这就是我到目前为止所拥有的。我正在将文件内容读入数组

public static void main(String[] args) 
    File file=new File("D:\\routes.txt");
    Scanner inputFile= new Scanner(file);

    int rows=inputFile.nextInt();
    int columns=inputFile.nextInt();

    double [][] array= new double [rows][columns];
    double lowest=array[0][0];

    for(int row=0; row <rows; row++ )
                    
        for(int col=0; col<rows; col++)
        
            array[row][col] =inputFile.nextDouble();
        
    

    printMatrix(array);   
    printPosition(array,rows,columns);


public static void printMatrix(double[][] M)

    for (int row=0; row<M.length; row++)
    
        for(int col=0; col<M[row].length; col++)
            System.out.printf("%7.2f  ", M[row][col]);
                    System.out.println();
    
     System.out.println();
     System.out.println();   


public static void printPosition(double [][]M,int y , int x)

    for (int row=0; row<M.length; row++)
    
        for (int col=0; col<M[row].length;col++)
            if (col==x && row==y)
                System.out.printf("%s","  X   ");
            else
                System.out.printf("%7.2f  ",M[row][col]);
        System.out.println();
    
    System.out.println();
    System.out.println();

【问题讨论】:

标点符号可能在这里有帮助,但我不知道在哪里添加它,因为你把它写成一个长长的意识流连续句(比如这个)。 我立即看到的一个错误是 main 中的嵌套 for 循环应该来自 col &lt; columns 欢迎来到 SO。您的问题的标题是“寻找最低价值”,但内容似乎暗示问题实际上是“寻找成本最低的路径”。您可能需要做一些工作来澄清您真正想要解决的问题。 @ElliottFrisch 如果您不知道在哪里添加它,添加您的评论到底有什么意义?你是想帮助 OP 还是只是把他们放下来让自己看起来更优秀?请尽量帮助新人。 @sprinter 我的意思是 OP 需要编辑问题以使其易于理解(也许通过适当的标点符号)。我不知道 OP 试图解决什么问题,你也不知道。我想帮助 OP;但我不能。那让我伤心。现在问题已被编辑。 How to debug small programs 是一个很好的起点! 【参考方案1】:

您的问题没有得到澄清。无论如何,假设从一个牢房我只能向右和向下走。并且路由值是从起始小区到目的小区的路径的总成本,需要最小化这个路由值。还需要打印出负责minimum 路由值的路径。

如果这是您正在寻找的,那么您可以很容易地解决这个问题。让我们声明一个数组:

 dp[row][col], dp[i][j] [0 <= i < row, 0 <= j < col] //will hold the minimum route value from (0, 0) to (i, j). 

那么dp[row - 1][col - 1] 将是最优路由值。考虑到这些职位有效,您只能从(i - 1, j) or (i, j - 1) 转到(i, j)

所以,dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + array[row][col],您需要处理 i - 1 或 j - 1 小于 0 的情况。要打印路径,您需要为单元格保存一些信息。对于(i, j),您需要保存从哪个单元格来到此单元格。

现在您需要打印路径。从目标单元格开始,您已经知道您是从哪个单元格到达的,然后转到该单元格并应用相同的逻辑,直到您到达起始单元格。现在您知道了路径,但是以相反的顺序,只需以相反的顺序打印它。

【讨论】:

【参考方案2】:
public static void pathFromPoint(double [][]M,int r , int c)

    double max = 101.0;
    int x,y;
    if (r-1>=0 && M[r-1][c]!=-1 && M[r-1][c]<max)
    
        max = M[r-1][c];
        x=r-1;y=c;
    
    .
    .
    .
    // Do the same for r+1,c and r,c-1 and r,c+1
    // Finally set the value of element (x,y) in the array as -1.0
    // Call pathFromPoint again with the array and x,y as r,c
    // check if r-1,r+1,c-1,c+1 is not out of the array range.
    // If you find no max, that is, if max remains as 101, just do return;
    System.out.println();
    System.out.println();

【讨论】:

以上是关于在二维数组中找到最小值的主要内容,如果未能解决你的问题,请参考以下文章

如何(稳健地)在python中的二维数组上找到局部最小值?

提取二维数组中最小点的索引

怎样求一个二维数组元素之和以及二维数组元素的最小值及下标

使用 STL 算法在表(向量的向量、二维数组)中查找最小值/最大值的优雅方法

PHP如何取二维数组中的某列的最大值和最小值?

用二维数组c找到最小数[关闭]