【问题标题】:Java Maze Shortest Path misunderstandingJava Maze Shortest Path 误解
【发布时间】:2016-04-01 11:38:45
【问题描述】:

这是代码,使用递归,我试图用最短路径解决迷宫,但它正在以更长的方式解决,我真的不明白为什么。这是递归代码:

public boolean findPath(int row, int col) {
board[row][col].visit();

if ((col == 7) && (row == 7)) {
  board[row][col].selectCell();
  return true;
}


if ((row > 0) && !board[row - 1][col].marked() &&
    !board[row - 1][col].blocked() && !board[row - 1][col].visited()) {
  block(row, col);

  if (findPath(row - 1, col)) {
    board[row][col].selectCell();
    return true;
  }

  unblock(row, col);
}

if ((row < 7) && !board[row + 1][col].marked() &&
    !board[row + 1][col].blocked() && !board[row + 1][col].visited()) {
  block(row, col);

  if (findPath(row + 1, col)) {
    board[row][col].selectCell();
    return true;
  }

  unblock(row, col);
}

if ((col > 0) && !board[row][col - 1].marked() &&
    !board[row][col - 1].blocked() && !board[row][col - 1].visited()) {
  block(row,col);
  if (findPath(row, col - 1)) {
    board[row][col].selectCell();
    return true;
  }

  unblock(row,col);
}

if ((col < 7) && !board[row][col + 1].marked() &&
    !board[row][col + 1].blocked() && !board[row][col + 1].visited()) {
  block(row,col);
  if (findPath(row, col + 1)) {
    board[row][col].selectCell();
    return true;
  }

  unblock(row,col);
}

return false;

}

它是 8x8 板,块功能是这样的:

public void block(int row, int col) {
if (row > 0) {
  board[row - 1][col].block();
}

if (row < 7) {
  board[row + 1][col].block();
}

if (col > 0) {
  board[row][col - 1].block();
}

if (col < 7) {
  board[row][col + 1].block();
}

}

当我尝试解决它时,它给了我这样的结果:

而不是:

我们将不胜感激!

【问题讨论】:

  • 你应该做一些调试。
  • 一招:使用你手头的算法,看看会发生什么。 2 在你的代码中添加一些跟踪,看看是否发生了同样的事情。 3您确定您的算法通过递归或一条可能的路径为您提供最短路径吗?
  • 我不明白的是,当我在代码中编写 if(row 时,为什么它会下降而不是正确

标签: java arrays function recursion shortest-path


【解决方案1】:

试试这个,应该可以直接完成:

public boolean findPath(int row, int col) {
  board[row][col].visit();

  if ((col == 7) && (row == 7)) {
    board[row][col].selectCell();
    return true;
  }

  if ((row < 7) && !board[row + 1][col].marked() &&
      !board[row + 1][col].blocked() && !board[row + 1][col].visited()) {
    block(row, col);

    if (findPath(row + 1, col)) {
      board[row][col].selectCell();
      return true;
    }

    unblock(row, col);
  }

  if ((col > 0) && !board[row][col - 1].marked() &&
      !board[row][col - 1].blocked() && !board[row][col - 1].visited()) {
    block(row,col);

    if (findPath(row, col - 1)) {
      board[row][col].selectCell();
      return true;
    }

    unblock(row,col);
  }

  if ((col < 7) && !board[row][col + 1].marked() &&
      !board[row][col + 1].blocked() && !board[row][col + 1].visited()) {
    block(row,col);

    if (findPath(row, col + 1)) {
      board[row][col].selectCell();
      return true;
    }

    unblock(row,col);
  }
  if ((row > 0) && !board[row - 1][col].marked() &&
      !board[row - 1][col].blocked() && !board[row - 1][col].visited()) {
    block(row, col);

    if (findPath(row - 1, col)) {
      board[row][col].selectCell();
      return true;
    }

    unblock(row, col);
  }

  return false;
}

您需要更改订单。

【讨论】:

  • 这正是我想要的,它成功了,谢谢!
  • 也许这不是最短路径,但我一直在寻找它
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2012-01-16
  • 2013-03-11
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多