c++ - 迷宫解算器记录回溯路径

标签 c++ maze

我已经让我的迷宫解算器程序开始工作,但它似乎在它输出的最终解决方案路径中包括回溯空间(它去的地方撞到墙上,所以它不得不掉头)。这是一个例子:

enter image description here

如何在我当前的以下实现中防止这种情况:

int dir = 4;

bool visited[Max_Maze][Max_Maze][dir];


for (row = 0; row < size; ++ row)
{
  for (col = 0; col < size; ++ col)
  {
    for (dir = 0; dir < 4; ++ dir)
    {
      visited[row][col][dir]=false;
    }
  }
}

bool notSolved = true;
int path = 0;
row = 0;
col = 0;

rowStack.push(row);
colStack.push(col);

while (notSolved)
{

  //from perspective of person looking at maze on screen
  if (((row-1)>=0)&&(maze[row - 1][col] == 0)&&(visited[row][col][0]==false))
  {
    // if that space is not out of bounds and if you can go up
    // and you have not gone in that direction yet, go up
    visited[row][col][0] = true; 
    row--;
    rowStack.push(row);
    colStack.push(col);
    path++;
  }
  else if (((col+1)<size)&&(maze[row][col + 1] == 0)&&(visited[row][col][1]==false))
  {
    //else if you can go right etc., go right
    visited[row][col][1] = true;
    col++;
    rowStack.push(row);
    colStack.push(col);
    path++;
  }
  else if (((row+1)<size)&&(maze[row + 1][col] == 0)&&(visited[row][col][2]==false))
  {
    //else if you can go down etc., go down
    visited[row][col][2] = true;
    row++;
    rowStack.push(row);
    colStack.push(col);
    path++;
  }
  else if (((col-1)>=0)&&(maze[row][col - 1] == 0)&&(visited[row][col][3]==false))
  {
    //else if you can go left etc., go left
    visited[row][col][3] = true;
    col--;
    rowStack.push(row);
    colStack.push(col);
    path++;
  }
  else
  {
    //if stuck
    if (path == 0)
    {
      cout << "No Solution Path" << endl;
      notSolved = false;
    }
    else
    {
      rowStack.pop();
      colStack.pop();
      row = rowStack.top();
      col = colStack.top();
      path--;
    }
  }

  if((maze[row][col] == 0) && (row == (size - 1) && col == (size - 1)))
  {
    //if we reached an exit
    cout << "Solution Path:(in reverse)" << endl;
    for (int i = 0; i <= path; i++)
    {
      cout << "row:" << rowStack.top() << " col:" << colStack.top() << endl;
      rowStack.pop();
      colStack.pop();
    }
    notSolved = false;
  }
}

需要简单的修复还是全面重组?

最佳答案

当求解器直接进入那个死胡同时,它会记录它“直接从 (R, C) 访问”,因为您访问的数组是三维的。但它从不记录它“从 (R, C + 1) 访问”。所以它认为移动到相同的 position 两次是可以的,只要它不做两次完全相同的移动(它没有,因为它在回溯时向左移动,而不是向右移动).

如果您将 visited 更改为二维数组并且仅记录位置,而不是移动,看起来它会正常工作。然后你之前访问过的每个方 block 都会阻止进一步的移动,但这没关系,因为如果正确的解决方案需要回到那个方 block ,你最终会遇到足够多的 else 情况以弹回到它,并且从那里三个必须是 never-参观广场探索。

关于c++ - 迷宫解算器记录回溯路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8332133/

相关文章:

java - 迷宫图像处理,修剪空白

algorithm - 一种简单的闭合多边形曲线生成算法

android - Android 的 Qt 缺少编译器

python - 从内容中查找字典

c++ - 调用 gcc _without_ -pthread 有什么好处?

c++ - 为什么不同 block 中相同命名的外部局部变量在 C++ 中的编译器之间获得不同的链接?

android - 如何使用 Kotlin 修复 Null 不能成为 Android 迷宫游戏中非空类型的值

graph - 如何将迷宫转换为图形?

c++ - 编译器循环引用

c++ - 为什么虚函数调用比 dynamic_cast 快?