从文件读取 [0.0,100.0] 范围内random doubles
的二维10×10数组的程序。您的程序将找到按照以下算法,从数组[0] [0]的左上角到数组[9] [9]的右下角的最小路由值:
从(0,0)开始,您只能从当前位置向右或向下移动。元素(0,1)是您的权利。 (1,0)处的元素是您的承受能力。
找到这两个元素中的最小值,然后移到那里。 “移到那里”的意思是它将成为您的新职位。
将最小值添加到累加器。记录您的新职位。
再次从当前位置向右和向下查看值。
找到这两个中的最小值,然后移到那里。继续将最小值添加到累加器中。
重复步骤4)和5),直到发生以下某些情况:
如果当前行是最后一行,则不允许您再向下移动。您唯一的选择是向右移动。
如果当前列为最后一列,则不允许再向右移动,唯一的选择是向下。
7。如果您位于最后一列和最后一行,则您已到达数组的末尾,程序结束并显示:
我陷入了每次以最低值打印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();
}
答案 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)
,您需要保存从哪个单元格进入此单元格。
现在,您需要打印路径。从目标单元格开始,您已经知道您来自哪个单元格,再转到该单元格,并且应用相同的逻辑,直到到达起始单元格为止。现在您知道了路径,但是顺序相反,只需按相反的顺序打印即可。