在二维数组中找到最小值

时间:2019-04-18 03:13:46

标签: java arrays

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

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

  2. 找到这两个元素中的最小值,然后移到那里。 “移到那里”的意思是它将成为您的新职位。

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

  4. 再次从当前位置向右和向下查看值。

  5. 找到这两个中的最小值,然后移到那里。继续将最小值添加到累加器中。

  6. 重复步骤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();
}

2 个答案:

答案 0 :(得分:0)

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();
}

答案 1 :(得分:0)

您的问题缺乏澄清。无论如何,假设从一个单元格我只能上下左右走。而路由值是从起始像元到目标像元的路径的总成本,需要将该路由值最小化。还需要打印负责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, j)转到(i - 1, j) or (i, j - 1)

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

现在,您需要打印路径。从目标单元格开始,您已经知道您来自哪个单元格,再转到该单元格,并且应用相同的逻辑,直到到达起始单元格为止。现在您知道了路径,但是顺序相反,只需按相反的顺序打印即可。