在二维数组中找到最小值
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 < 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();
【讨论】:
以上是关于在二维数组中找到最小值的主要内容,如果未能解决你的问题,请参考以下文章