【发布时间】:2012-01-09 08:38:35
【问题描述】:
我要以某种方式使用堆栈的链表实现来生成迷宫的解决方案。迷宫是从 .txt 文件中读取的,由 0 代表开放空间和 1 代表墙壁。
我尝试使用的算法是:
While Not At End
If Can Go North
Go North
ElseIf Can Go East
Go East
ElseIf Can Go South
Go South
ElseIf Can Go West
Go West
EndIf
Wend
我一直在尝试的方式依赖于在数组索引中执行的 ++ 操作。我不知道数组下标运算符 [ 优先于 ++ 所以现在我需要重新考虑解决方法。在这样做之前,我想确保这种方法甚至可以首先工作。到目前为止,任何人都可以看看我的算法代码并提供一些反馈吗? (注意:我仍然需要添加一些代码来跟踪路径以避免某种类型的无限循环)
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 (maze[row--][col] == 0){//if you can go up, go up
rowStack.push(row);
colStack.push(col);
path++;
}
else if (maze[row][col++] == 0){//else if you can go right, go right
rowStack.push(row);
colStack.push(col);
path++;
}
else if (maze[row++][col] == 0){//else if you can go down, go down
rowStack.push(row);
colStack.push(col);
path++;
}
else if (maze[row][col--] == 0){//else if you can go left, go left
rowStack.push(row);
colStack.push(col);
path++;
}
if((maze[row][col] == 0) && (row == (size - 1))){//if we reached an exit
cout << "Solution Path:" << endl;
for (int i = 0; i < path; i++){
cout << "row:" << rowStack.top() << " col:" << colStack.top() << endl;
rowStack.pop();
colStack.pop();
}
notSolved = false;
}
}
在 ++ 之前执行 [ 的问题:
任何帮助表示赞赏,谢谢!
【问题讨论】:
-
递归是你的朋友。
-
您有什么具体问题吗?
-
我觉得这个算法不是特别好,比如你在水平隧道里碰到右边的墙,你会永远从右到左来回弹跳。
-
@Erix 搜索广度优先在迷宫中效果更好,因此在这种情况下,队列可能是比递归更好的“朋友”。即使您决定采用深度优先,使用堆栈和“while”循环而不是递归可能会更好。由于搜索空间随着 N^2 增长,递归调用中溢出堆栈的危险变得非常现实。