我已经编程了大约五年了,我在创建动态迷宫时没有遇到任何问题。但是现在谈到递归回溯,我完全不知道从哪里开始。我已经阅读了很多教程、主题和一些算法维基(dijkstra 的算法),它们对我来说毫无意义。
我知道基本递归是如何工作的,但我根本无法理解如果不(在我看来)存储先前搜索的路径或者如果正在跟踪的路径突然分成两部分会发生什么情况下递归回溯是如何可能的。
我的程序是这样工作的:迷宫由 484 个面板组成(Panel[] 数组名为 mazeTiles)。有 22 行,每行有 22 个面板。黑色面板背景是墙壁,白色面板是可穿越的。
这是它在运行时的样子(并且只有在没有从起始方块(红色)到左上角绿色方块的有效路径时才会显示错误消息:
http://postimg.org/image/6c7wgxtz1/
显示的错误消息是“迷宫无法解决”,即使它可以清楚地解决。此错误消息位于 Button2_Click 方法中。
下面是我从教程中获取的代码(并修改过),问题肯定出在方法中,但我不知道如何解决这个问题。
private void button2_Click(object sender, EventArgs e)
{
int startPosition = 0;
for (int i = 0; i < mazeTiles.Length; i++)
{
if (mazeTiles[i].BackColor == Color.Red)
{
startPosition = i;
}
}
bool[] alreadySearched = new bool[484];
if (!solveMaze(startPosition, alreadySearched))
MessageBox.Show("Maze can not be solved.");
}
private bool solveMaze(int position, bool[] alreadySearched)
{
bool correctPath = false;
//should the computer check this tile
bool shouldCheck = true;
//Check for out of boundaries
if (position >= mazeTiles.Length || position < 0 )
shouldCheck = false;
else
{
//Check if at finish, not (0,0 and colored light blue)
if (mazeTiles[position].BackColor == Color.Green)
{
correctPath = true;
shouldCheck = false;
}
//Check for a wall
if (mazeTiles[position].BackColor == Color.Black)
shouldCheck = false;
//Check if previously searched
if (alreadySearched[position])
shouldCheck = false;
}
//Search the Tile
if (shouldCheck)
{
//mark tile as searched
alreadySearched[position] = true;
//Check right tile
correctPath = correctPath || solveMaze(position + 1, alreadySearched);
//Check down tile
correctPath = correctPath || solveMaze(position + 22, alreadySearched);
//check left tile
correctPath = correctPath || solveMaze(position - 1, alreadySearched);
//check up tile
correctPath = correctPath || solveMaze(position - 22, alreadySearched);
}
//make correct path gray
if (correctPath)
mazeTiles[position].BackColor = Color.Gray;
return correctPath;
}
我需要找到并存储从红色方块到绿色的所有路径或最快的路径(并且只标记最快的路径)。绿色方块是静态的,而红色方块和整个迷宫是随机生成的。