以下程序无需递归即可解决迷宫问题。程序正在运行,但是我无法弄清楚迭代器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
答案 0 :(得分:1)
在第19行,打印出与“当前”位置相邻的第一个位置。
在第21行,您正在打印连接到您所考虑的“当前”位置的位置。如果您以前从未访问过该职位,则只能访问该职位。
如果没有未访问的“下一个”位置,您将知道解决方案不涉及遍历“当前”位置,因此您可以退后一步,然后尝试从那里进行后续连接。
按照以下步骤进行操作:
Dropdown