我正在尝试在一个二维数组(迷宫)中实现迭代加深搜索。
static void Run_Ids(int x, int y) { int depth_limit = 0; while(!cutoff) { out.println("正在进行深度为: " + depth_limit + " 的搜索"); depthLimitedSearch(x, y, depth_limit); depth_limit++; } }
这是我使用栈实现的有限深度优先搜索。不知为何,它在两个单元格之间来回移动,而不是像预期的那样扩展。我认为我的DFS算法可能有问题。
static void depthLimitedSearch(int x, int y, int depth){ Pair successor; //pair 是 x, y 坐标 successor = starting(); //将后继设置为起始单元格 stack = new Stack<>(); int i = 0; stack.push(successor); while (!stack.isEmpty()) { out.println("i 级别: " + i); Pair parent = stack.peek(); //在这里弹出? if (parent.x == Environment.goal[0] && parent.y == Environment.goal[1]){ //检查是否到达目标 cutoff = true; out.println("找到目标 "); break; } if (i == depth){ //stack.pop(); //在这里弹出? break; } else{ Pair leftPos,rightPos,upPos,downPos; leftPos = leftPosition(parent.x, parent.y); rightPos = rightPosition(parent.x, parent.y); upPos = upPosition(parent.x, parent.y); downPos = downPosition(parent.x, parent.y); if(Environment.isMovePossible(rightPos.x, rightPos.y)) //如果可以向右移动 stack.push(rightPos); if(Environment.isMovePossible(leftPos.x, leftPos.y)) // 如果可以向左移动 stack.push(leftPos); if(Environment.isMovePossible(downPos.x, downPos.y)) //如果可以向下移动 stack.push(downPos); if(Environment.isMovePossible(upPos.x, upPos.y)) //如果可以向上移动 stack.push(upPos); stack.pop(); //在这里弹出? } //else i++; }//while }
我对栈的使用经验不多,我对何时推入和何时弹出感到困惑。如果这里有人能指导我正确的方向,那就太好了!
回答:
我认为你需要标记已经访问过的数组位置,以避免重复访问。不要将已经访问过的位置推入栈中。
如果不这样做,你很可能会陷入无限循环:
例如,假设从你的初始位置你可以向所有方向前进 – 左、右、上、下。所以你推入了这四个位置,然后弹出了最后推入的 – 下。
只要向下是一个有效的方向,你就会继续向下移动。当你到达一个无法继续向下的位置时,你会推入下一个有效的方向,其中包括向上(你刚刚来的方向)。
由于你在推入向下之前推入了向上,当你到达无法推入向下的位置时,向上将是最后推入的位置,这意味着你会弹出向上位置并回到你来的位置。
从那里你会再次向下移动,然后又向上移动,形成一个无限循环。