迭代器如何在以下程序中工作

时间:2019-05-23 08:47:55

标签: c++ list stl backtracking maze

以下程序无需递归即可解决迷宫问题。程序正在运行,但是我无法弄清楚迭代器iter的工作方式。

第19行第21行中有两个注释。我尝试打印iterator的价值

  

{1,0,1,0,1,0,3,4,3,4}

  

{1,0,2,1,0,2,1,3,0,4,3,5,4,3,5,7,4,8}`

分别。

simpleMaze中的main()显示了元素和迷宫路径之间的联系。由于0连接到(1,3); 1连接到(0,2),依此类推。

迭代器用于遍历,然后为什么该程序给出这样的顺序,我也无法理解函数solveMaze的流程。

#include <bits/stdc++.h>

using namespace std;

list<int> solveMaze(list<int> maze[],int start,int finish) {
    unordered_set<int> visited;
    list<int> path;

    path.push_back(start);
    int currentPoint=start;
    visited.insert(currentPoint);

    while(path.back()!= finish && path.empty() == false)     {
        list<int>::iterator iter = maze[currentPoint].begin();
        bool foundOutlet = false;
        cout<<*iter<<"\n";     //line 19
        while(iter!=maze[currentPoint].end() && (foundOutlet== false)) {
        cout<<*iter<<"\n";   //line 21
            if(visited.count(*iter)==0) {
                foundOutlet = true;
            }
            else {
                iter++;
            }
        }
        if(foundOutlet)
        {
            path.push_back(*iter);
            visited.insert(*iter);
        }
        else
        path.pop_back();
        currentPoint= path.back();
    }

    return path;
}


int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    list <int> simpleMaze[9],path;
    simpleMaze[0].push_back(1);
    simpleMaze[0].push_back(3);

    simpleMaze[1].push_back(0);
    simpleMaze[1].push_back(2);

    simpleMaze[2].push_back(1);

    simpleMaze[3].push_back(0);
    simpleMaze[3].push_back(4);
    simpleMaze[3].push_back(6);


    simpleMaze[4].push_back(3);
    simpleMaze[4].push_back(5);
    simpleMaze[4].push_back(7);

    simpleMaze[5].push_back(4);

    simpleMaze[6].push_back(3);

    simpleMaze[7].push_back(4);
    simpleMaze[7].push_back(8);

    simpleMaze[8].push_back(7);


    path = solveMaze(simpleMaze,0,8);

    list<int>::iterator it;
    for(it=path.begin();it!=path.end();++it)
    {
        cout<<*it<<"\n";
    }
    return 0;

}

迷宫的解决方法是

  

0 3 4 7 8

1 个答案:

答案 0 :(得分:1)

在第19行,打印出与“当前”位置相邻的第一个位置。

在第21行,您正在打印连接到您所考虑的“当前”位置的位置。如果您以前从未访问过该职位,则只能访问该职位。

如果没有未访问的“下一个”位置,您将知道解决方案不涉及遍历“当前”位置,因此您可以退后一步,然后尝试从那里进行后续连接。

按照以下步骤进行操作:

Dropdown