Java 堆栈溢出错误骑士之旅
我有这个骑士巡演代码,但在第37行得到一个java.lang.StackOverflower错误。我真的不知道从这里到哪里去修理它。我认为我的主要代码与此有关,但我不确定此时该如何处理它。非常感谢您的帮助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
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
设置为什么?在哪里换的?它们是如何使用的?这对你有意义吗?