Java 堆栈溢出错误骑士之旅

Java 堆栈溢出错误骑士之旅,java,stack-overflow,Java,Stack Overflow,我有这个骑士巡演代码,但在第37行得到一个java.lang.StackOverflower错误。我真的不知道从这里到哪里去修理它。我认为我的主要代码与此有关,但我不确定此时该如何处理它。非常感谢您的帮助 public class Main { public static void main(String[] args) { Main tour = new Main(); tour.solveKnightTour(); } private static int chessboar

我有这个骑士巡演代码,但在第37行得到一个java.lang.StackOverflower错误。我真的不知道从这里到哪里去修理它。我认为我的主要代码与此有关,但我不确定此时该如何处理它。非常感谢您的帮助

public class Main {
public static void main(String[] args) {
    Main tour = new Main();
    tour.solveKnightTour();
}
private static int chessboard[][];
boolean a = true;
public Main() {
    chessboard = new int[8][8];
}
private void matrixChessBoard() {
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            System.out.printf("%5d", chessboard[i][j]);
        }
        System.out.println();
    }
}
static boolean tour(int advance, int horizontal, int vertical, int xMove[], int yMove[]) {
    int i = 0;
    int moveHoriz = 0;
    int moveVert = 0;
    boolean a = true;
    chessboard[horizontal][vertical] = advance;
    if (advance == 63) {
        for (int t = 0; t < 8; t++) {
            for (int u = 0; u < 8; u++) {
                System.out.printf("%5d", chessboard[t][u]);
            }
            System.out.println("\n");
        }
    } else {
        for (int j = 0; j < 8; j++) {
            if ((horizontal + xMove[j] < 8 & (vertical + yMove[j]) >= 0 & (vertical + yMove[i]) < 8)
                    & (horizontal + xMove[i]) >= 0){
                if (chessboard[horizontal + xMove[i]][vertical + yMove[i]] == -1){
//line 37           if (tour(moveHoriz, moveVert, advance + 1, xMove, yMove)){
                        break;
                    }
                }
            }
        }
        a = false;
        chessboard[horizontal][vertical] = -1;
    }
    return a;
}
public boolean solveKnightTour() {
    for (int x = 0; x < 8; x++) {
        for (int y = 0; y < 8; y++) {
            chessboard[x][y] = -1;
        }
    }
    int xMove[] = { 2, 1, -1, -2, -2, -1, 1, 2 };
    int yMove[] = { 1, 2, 2, 1, -1, -2, -2, -1 };
    chessboard[0][0] = 0;
    if (!tour(0, 0, 1, xMove, yMove)) {
        return false;
    } else {
        matrixChessBoard();
    }
    return true;
}
公共类主{
公共静态void main(字符串[]args){
主巡更=新主巡更();
tour.solveKnightTour();
}
私有静态整数棋盘[];
布尔值a=真;
公用干管(){
棋盘=新整数[8][8];
}
私有无效矩阵切丝板(){
对于(int i=0;i<8;i++){
对于(int j=0;j<8;j++){
System.out.printf(“%5d”,棋盘[i][j]);
}
System.out.println();
}
}
静态布尔巡更(int-advance、int-horizontal、int-vertical、int-xMove[],int-yMove[]){
int i=0;
int moveHoriz=0;
int moveVert=0;
布尔值a=真;
棋盘[水平][垂直]=前进;
如果(预付=63){
for(int t=0;t<8;t++){
对于(int u=0;u<8;u++){
System.out.printf(“%5d”,棋盘[t][u]);
}
System.out.println(“\n”);
}
}否则{
对于(int j=0;j<8;j++){
如果((水平+xMove[j]<8&(垂直+yMove[j])>=0&(垂直+yMove[i])<8)
&(水平+xMove[i])>=0){
如果(棋盘[horizontal+xMove[i]][vertical+yMove[i]]]=-1){
//第37行if(巡视(移动HORIZ、移动VERT、前进+1、xMove、yMove)){
打破
}
}
}
}
a=假;
棋盘[水平][垂直]=-1;
}
返回a;
}
公共骑士之旅(){
对于(int x=0;x<8;x++){
对于(int y=0;y<8;y++){
棋盘[x][y]=-1;
}
}
int xMove[]={2,1,-1,-2,-2,-1,1,2};
int-yMove[]={1,2,2,1,-1,-2,-2,-1};
棋盘[0][0]=0;
如果(!巡更(0,0,1,xMove,yMove)){
返回false;
}否则{
matrixChessBoard();
}
返回true;
}

}

考虑精简版的
tour()
方法:

static boolean tour(int advance, int horizontal, int vertical, ...) {
    int moveHoriz = 0;
    int moveVert = 0;
    if (false) {
        ...
    } else {
        if (true)
            tour(moveHoriz, moveVert, advance + 1, ...);
    }
}
使用
tour(0,0,1,…)
调用,函数将使用
advance=0
进入。将完成各种分配,进行各种测试,然后执行
tour(moveHoriz,moveVert,advance+1,…)
语句,其计算结果为调用
tour(0,0,1,…)
。重复此操作,直到堆栈溢出

  • moveHoriz
    被传递到
    advance
    参数
  • moveVert
    被传递到
    horizontal
    参数
  • advance+1
    被传递到
    vertical
    参数

这显然不是你想要的。由于
advance+1
未传递给
advance
,因此
if(advance==63)
条件的计算结果将始终为
false
,并且您从未中断递归。

您在IDE调试器中跟踪过代码吗?这是开始的地方。使用调试器逐步检查代码并找出代码的问题所在。当你在这里发帖并说第37行时,如果你在代码中的第37行加上一条注释,这会很有帮助,所以我们不必计算行数。很抱歉,我刚刚更新了它,以显示第37行。我运行了调试器,但它最终没有响应。在本地主机的Main下,它表示在
tour()
方法中,有一个变量
i
,初始化为零,并且从未更改。你用它干什么?这对你有意义吗?
moveHoriz
moveVert
设置为什么?在哪里换的?它们是如何使用的?这对你有意义吗?