java问题中的另一个深度优先搜索

java问题中的另一个深度优先搜索,java,depth-first-search,Java,Depth First Search,我打算用java实现一个深度优先搜索算法,以找到在二次矩阵中移动的最佳方式。我避免创建“不必要的”对象,即仅保持(X,Y)位置的对象 我忘了什么吗?我运行它的起点是(0,0),目标是(4,5)。发生的是一个无限循环 int x = this.move_to_x; int y = this.move_to_y; Stack X = new Stack(); Stack Y = new Stack(); Stack visited_X = new Stack(); Stack visited_Y

我打算用java实现一个深度优先搜索算法,以找到在二次矩阵中移动的最佳方式。我避免创建“不必要的”对象,即仅保持(X,Y)位置的对象

我忘了什么吗?我运行它的起点是(0,0),目标是(4,5)。发生的是一个无限循环

int x = this.move_to_x;
int y = this.move_to_y;

Stack X = new Stack();
Stack Y = new Stack();

Stack visited_X = new Stack();
Stack visited_Y = new Stack();

X.push(this.current_x);
Y.push(this.current_y);

while(!X.empty()){
    int tmp_x = (int)X.pop();
    int tmp_y = (int)Y.pop();

    if(tmp_x == x && tmp_y == y){
        System.out.println("best way found!");
        return;
    }

    //there is only 8 possible ways to go (the neighbors)
    for(int a = -1; a < 2; a++){
        for(int b = -1; b < 2; b++){
            if(a == 0 && b == 0){
                break;
            }

            if(visited_X.search(tmp_x + a) == -1 && visited_Y.search(tmp_y + b) == -1){
                X.push(tmp_x + a);
                Y.push(tmp_y + b);

                visited_X.push(tmp_x + a);
                visited_Y.push(tmp_y + b);

                System.out.println("added x " + tmp_x + a + " y " + tmp_y + b);
            }
        }
    }
}
int x=this.move_to_x;
int y=这个。移动到y;
堆栈X=新堆栈();
堆栈Y=新堆栈();
堆栈访问_X=新堆栈();
堆栈访问_Y=新堆栈();
X.push(此为当前_X);
Y.push(此为当前值);
而(!X.empty()){
int tmp_x=(int)x.pop();
int tmp_y=(int)y.pop();
if(tmp_x==x&&tmp_y==y){
System.out.println(“找到最佳方法!”);
返回;
}
//只有8条路可走(邻居)
对于(int a=-1;a<2;a++){
for(intb=-1;b<2;b++){
如果(a==0&&b==0){
打破
}
if(已访问搜索(tmp\u X+a)=-1和已访问搜索(tmp\u Y+b)=-1){
X.push(tmp_X+a);
Y.push(tmp_Y+b);
访问推送(tmp\U X+a);
访问推送(tmp推送+b);
系统输出打印项次(“添加x”+tmp_x+a+“y”+tmp_y+b);
}
}
}
}

我可以看到几个问题:

1) 在以下方面:

        if(a == 0 && b == 0){
            break;
        }
if(visited_X.search(tmp_x + a) == -1 && visited_Y.search(tmp_y + b) == -1){
您应该使用
continue
而不是
break

2) 以下是:

        if(a == 0 && b == 0){
            break;
        }
if(visited_X.search(tmp_x + a) == -1 && visited_Y.search(tmp_y + b) == -1){
不正确:
(tmp\u x,tmp\u y)
对必须存在于
已访问的\u x/已访问的\u y
中的同一索引中

3) 您应该将起始位置添加到
已访问的{X,Y}

4) 在算法上,我看不出有任何理由认为您的方法会返回最短路径


5) 您的代码最终进入(几乎)无限循环的原因是您没有检查矩阵边界。

我可以看到几个问题:

1) 在以下方面:

        if(a == 0 && b == 0){
            break;
        }
if(visited_X.search(tmp_x + a) == -1 && visited_Y.search(tmp_y + b) == -1){
您应该使用
continue
而不是
break

2) 以下是:

        if(a == 0 && b == 0){
            break;
        }
if(visited_X.search(tmp_x + a) == -1 && visited_Y.search(tmp_y + b) == -1){
不正确:
(tmp\u x,tmp\u y)
对必须存在于
已访问的\u x/已访问的\u y
中的同一索引中

3) 您应该将起始位置添加到
已访问的{X,Y}

4) 在算法上,我看不出有任何理由认为您的方法会返回最短路径


5) 代码最终进入(几乎)无限循环的原因是您没有检查矩阵边界。

使用调试器的最佳情况;-)使用调试器的完美案例;-)4) 你说得对。我把深度优先搜索和广度优先搜索混淆了。我把深度优先搜索和广度优先搜索混淆了。