我需要按如下方式在螺旋阵列中添加枢轴点:
21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13
我有java代码可以做到这一点,并且它可以很好地使用如上所示的小型5x5数组......但是当我用大型1001x1001数组测试它时,它给了我很多堆栈溢出。我不知道如何跟踪它,我已经尝试过捕获但没有成功。代码如下。有没有人有任何建议?
public class Spiral {
int[][] arr = new int[1001][1001];
int counter = 1;
public int total = 1;
String direction = "SOUTH";
public Spiral(){
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
arr[i][j] = 0;
}
}
try {
arr[500][500] = 1;
spiral(500, 501);
total += arr[0][arr.length - 1];
System.out.println(total);
} catch (Exception e) {
e.printStackTrace();
//System.out.println(x + ", " + y);
}
}
public void spiral(int x, int y) {
counter++;
arr[x][y] = counter;
if(x==900&&y==900)
System.out.println("here");
if (direction == "SOUTH") {
if (arr[x][y - 1] != 0) {
if (x + 1 < arr.length)
spiral(x + 1, y);
} else {
total += arr[x][y];
direction = "WEST";
spiral(x, y - 1);
}
} else if (direction == "WEST") {
if (arr[x - 1][y] != 0) {
if (y - 1 >= 0) {
spiral(x, y - 1);
}
} else {
total += arr[x][y];
direction = "NORTH";
spiral(x - 1, y);
}
} else if (direction == "NORTH") {
if (arr[x][y + 1] != 0) {
if (x - 1 >= 0) {
spiral(x - 1, y);
}
} else {
total += arr[x][y];
direction = "EAST";
spiral(x, y + 1);
}
} else if (direction == "EAST") {
if (arr[x + 1][y] != 0) {
if (y + 1 < arr.length) {
spiral(x, y + 1);
}
} else {
total += arr[x][y - 1];
direction = "SOUTH";
spiral(x + 1, y);
}
}
}
}
答案 0 :(得分:4)
spiral(int,int)是递归的,并且它自己调用了很多次以至于它溢出了堆栈。您有两种选择:
答案 1 :(得分:0)
您的算法会针对数组中的每个单元格重复出现。你的筹码是否真的足以重复1,002,001次?如果没有,那么你将不得不使你的堆栈更大或尝试不同的算法。
答案 2 :(得分:0)
我认为你会看到这个问题,因为你的递归是如何工作的。您以递归方式调用spiral
来打印出您的数据,但是当使用1001x1001数据集调用它时,您创建的堆栈跟踪也很大,导致JVM崩溃并最终导致堆栈溢出错误。
答案 3 :(得分:0)
由于您正在使用递归,很明显您将获得大输入的StackOverFlow异常。
尝试使用-Xss开关调整vm。