我将以某种方式使用堆栈的链表实现来生成迷宫的解决方案。迷宫是从.txt文件中读取的,由0开放空间和1英尺墙组成。 < - 很确定退出必须在底行?那么这三个0?
我尝试使用的算法是:
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;
}
}
执行问题[在++之前:
感谢任何帮助,谢谢!
答案 0 :(得分:2)
你的算法在某些具有圆形路径的迷宫中不起作用:一旦你进入其中一个,你就会进入圈子。要解决此问题,您需要添加一个布尔数组visited [R] [C] [DIR],其中DIR是一个从0到3的数字,表示方向。当您将单元格[r] [c]保留在[d]方向时,将visit [r] [c] [d]设置为true。下次您访问同一个单元格时,看看之前是否已将其保持在同一方向;如果你这样做,跳过那个方向,然后去下一行。
答案 1 :(得分:0)
++
和--
实际上修改了行/列变量。我想你想做maze[row - 1][col] == 0
,然后一旦你搬家,就更新你的行位置。