【发布时间】:2014-12-20 04:37:42
【问题描述】:
我查看了许多与此问题类似的论坛代码,但我仍然无法解决我的问题。基本上,给定一个大小为 n 的二维方阵,填充 [-100,100] 内的整数,我必须找到最大和,因为路径的长度为 10。这是从某个给定的网格开始完成的(用 * 表示)。两次访问同一个网格是违法的。
一个示例测试用例是:
-55 34 -51 35 1
-76 26 69 61 *
68 98 17 85 81
-27 -69 49 42 83
-10 31 44 75 -41
将产生637 的最大总和。
用路径表示:61 69 26 98 17 85 81 83 42 75
如果我没记错的话,我的代码的问题是关于标记我之前访问过的网格。但我不知道如何解决..
下面是我的代码:
import java.util.*;
class Maze
{
static int[][] matrix;
static int counter = 0;
static int size = 0;
static int maximum = -100000;
static int result = -1000000;
static int currMax;
static int topMax, downMax, leftMax, rightMax;
public static void main(String [] args)
{
Scanner sc = new Scanner(System.in);
size = sc.nextInt();
matrix = new int[size][size];
int xcord = 0;
int ycord = 0;
for (int i=0; i<size; i++){
for (int j=0; j<size; j++){
if (sc.hasNextInt()){
int util = sc.nextInt();
matrix[i][j] = util;
}
else{
String utilStr = sc.next();
xcord = i;
ycord = j;
matrix[i][j] = -2000;
}
}
}
result = 2000 + findMax(xcord, ycord);
System.out.println(result);
}
static int findMax(int currx, int curry){
if (counter >= 9){
return matrix[currx][curry];
}
else {
counter = counter+1;
System.out.println("Round: "+counter);
System.out.println("currx: "+currx+" curry: "+curry);
int temp = matrix[currx][curry];
matrix[currx][curry] = -2000;
downMax = -10000; //To reset it for comparison
if (currx+1 != size && matrix[currx+1][curry] == -2000){
downMax = findMax(currx+1,curry);
}
rightMax = -10000;
if (curry+1 != size && matrix[currx][curry+1] == -2000){
rightMax = findMax(currx,curry+1);
}
topMax = -10000;
if (currx-1 >=0 && matrix[currx-1][curry] == -2000){
topMax = findMax(currx-1,curry);
}
leftMax = -10000;
if (curry-1 >= 0 && matrix[currx][curry-1] == -2000){
leftMax = findMax(currx,curry-1);
}
matrix[currx][curry] = temp;
currMax = Math.max(downMax,rightMax);
currMax = Math.max(currMax, topMax);
currMax = Math.max(currMax, leftMax);
maximum = currMax + temp;
return maximum;
}
}
}
提前致谢!!
【问题讨论】:
-
这里有一些提示:你没有做任何事情来标记你已经访问过的地方。如果你这样做,它也将帮助你摆脱相当随意的“2000”标志。此外,您永远不会增加
counter,因此一旦完成一次遍历,它就会保持在 9。我建议将当前深度作为参数而不是静态字段传递。 -
感谢您的回复!在将深度作为参数传递后,我设法完成了递归。但是,我对已访问网格的标记仍然不起作用。我使用 matrix[currx][curry] = -5000 来标记我已经通过的节点,然后将值设置回来。为什么它不起作用?
-
这不是因为有许多可能的路径可能会给你想要的答案,但是当你用 -5000 标记一个字段时,这个单元格会被所有其他潜在路径污染。
-
哦,但是我正在使用 matrix[currx][curry] = temp 在同一个递归中将值改回,所以不会恢复该值(从而再次打开路径?)。抱歉,我不太明白。关于如何标记路径的任何建议?
-
你在所有的递归之后把它改回来。所以所有更深的递归级别仍然看到标志。
标签: java recursion path multidimensional-array maze