Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迷宫解算器记录回溯路径_C++_Maze - Fatal编程技术网

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

C++ 迷宫解算器记录回溯路径,c++,maze,C++,Maze,我已经让我的迷宫解算程序开始工作了,但它似乎在输出的最终解算路径中包含了回溯空间(它去的地方并撞到了墙,所以它不得不掉头)。以下是一个例子: 我如何在下面的当前实施中防止这种情况: 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

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

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

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;
  }
}
intdir=4;
布尔参观了[马克斯迷宫][马克斯迷宫][迪尔];
用于(行=0;行<大小;++行)
{
用于(列=0;列=0)和&(迷宫[第1行][col]=0)和&(访问[第1行][col][0]=false))
{
//如果那个空间没有超出范围,如果你能上去
//你还没有朝那个方向走,上去
已访问[行][col][0]=真;
行--;
rowStack.push(行);
colStack.push(col);
path++;
}

否则,如果((col+1)当解算器直接进入死角时,它会记录它“从(R,C)访问了右侧”,因为您访问的数组是三维的。但它不会记录它从(R,C+1)访问了左侧.所以它认为移动到同一位置两次是可以的,只要它不做两次完全相同的移动(它不做,因为它后退时向左移动,而不是向右移动)


如果将访问的方块改为二维数组,只记录位置,而不记录移动,看起来效果会很好。然后,您之前访问过的每个方块都会阻止进一步移动,但这没关系,因为如果正确的解决方案需要返回到该方块,您最终会碰到足以弹出bac的else情况K到它,从那里三必须是一个从未访问过的方块去探索。

< P>不评论你的具体解决方案,你可以考虑重做为标准的深度优先搜索算法,我想你会同意更清楚一些:

boolean dfs (State s) {
    if (end_state(s)) {
        return true;
    }

    vector<option_t> options = generate_moves(s);
    for (vector<option_t>::iterator it = options.begin();
         it != options.end(); it++) {
        make_move(s, it);
        boolean found = dfs(s);
        if (found) {
            cout << s << endl;
        }
        undo_move(s, it);
        if (found) return true;
    }
    return false;
}
布尔dfs(状态s){
如果(结束状态){
返回true;
}
向量选项=生成移动;
for(vector::iterator it=options.begin();
it!=options.end();it++){
行动起来;
布尔值=dfs(s);
如果(找到){

它是否可以简单地打印找到的第一个解决方案或所有解决方案?是的,它没有找到最快的解决方案或任何东西,只是第一个好的,我认为我正确地实现了更改:仍然存在相同的问题:这次它只包含一个回溯空间?@mwmnj我没有时间详细阅读您的代码(这是你的作业,不是我的),但我可以想到一些可能出错的事情。请确保将起始广场记录为已访问的广场。如果您在离开之前记录了已访问的广场,请确保在弹出框中也这样做。如果您在进入之前记录了已访问的广场,请确保您记录的是即将访问的广场,而不是您要访问的广场'您当前在中。如果所有这些都没有问题,请逐步检查您的代码,找出它在何时会返回到哪里,并找出原因。忘记标记访问的第一个方块,谢谢您的帮助!