【发布时间】:2015-01-29 05:25:02
【问题描述】:
我正在尝试将二维矩阵实现为迷宫。有一个起点,一个终点(随机选择)。为了使它有点复杂,有障碍和代理。如果老鼠遇到障碍物,它应该回溯并找到正确的路径。如果它遇到代理,它就会被销毁。 这是一个示例 4x4 矩阵
1 7 1 1
2 1 1 0
1 0 1 0
1 1 1 9
键:0 是障碍物,2 是代理,7 是起点,9 是目标/终点。 1 表示可以安全地移动到那里。
这个矩阵的正确解是:
0 1 1 0
0 0 1 0
0 0 1 0
0 0 1 1
但是老鼠并不聪明(至少对于这个程序来说),所以我正在实现一个蛮力算法,随机移动。
我尝试使用名为 mazeUtil() 的递归函数来实现这一点。
下面是函数:
maze[][] 是老鼠移动经过的随机初始矩阵。
solution[][] 是将跟踪移动的解决方案矩阵。
(x, y) 是网格中的当前位置
n 是矩阵的大小(它是一个方阵)。
public static void mazeUtil(int maze[][], int solution[][], int x, int y, int n)
{
if(x == goal[0] && y == goal[1])
{
solution[x][y] = 1;
return;
}
int check = moveCheck(maze, x, y, n);
//moveCheck() return 0 for Obstacle, 1 for safe path, 2 for agent, 7 for starting point (also safe path), 9 for goal (safe path)
if (check == 2){
solution[x][y] = 1;
out.println("Oops! Ran into an agent!");
return;
}
else if(check == 0)
{
//What should I put here?
}
else if(check == 1 || check == 7 || check == 9)
{
solution[x][y] = 1;
Random newRandom = new Random();
int temp = newRandom.nextInt(3);
if(temp == 0){ //move up if possible? x--
if(x > 0)
mazeUtil(maze, solution, x-1, y, n);
else
mazeUtil(maze, solution, x+1, y, n);
}
else if (temp == 1){
if (x < n-1)
mazeUtil(maze, solution, x+1, y, n);
else
mazeUtil(maze, solution, x-1, y, n);
}
else if(temp == 2){
if (y < n-1)
mazeUtil(maze, solution, x, y+1, n);
else
mazeUtil(maze, solution, x,y-1, n);
}
else if (temp == 3){
if (y > 0)
mazeUtil(maze, solution, x, y-1, n);
else
mazeUtil(maze, solution, x, y+1, n);
}
}
}
我必须随机化移动,这就是我使用随机函数的原因。如果它遇到代理 (2),我的功能运行良好。我还阻止了老鼠越界。并且通过安全路径(1)没有任何问题。但问题是当它遇到障碍时。我正在考虑回溯。如何将其添加到我的函数中?就像保存最后一步,然后做相反的事情?而且很有可能像这样的迷宫中没有解决方案
7 0 0 9
2 0 1 1
0 1 0 0
1 2 0 1
如果它向右,它会撞到障碍物,如果它向下,它会撞到一个代理。它不能沿对角线移动。 这让我想到了第二个问题,在这种情况下我将如何终止我的递归函数。 此时它终止的唯一时间是它到达目标或击中代理。
任何帮助将不胜感激。提前致谢
【问题讨论】:
-
你看过寻路算法吗?这类事情有众所周知的、经过充分研究的解决方案:A*、Dijkstra 等:en.wikipedia.org/wiki/Dijkstra%27s_algorithm
-
我有,没有帮助。另外,很高兴能对这个问题进行一些解释,并从这里的许多人那里获得 cmets。我真的从 stackoverflow 中学到了很多
-
没有帮助你怎么办?您应该就您尝试过的算法所遇到的问题提出一个具体问题,而不是自己动手。
-
如果你的目标是找到一条穿过迷宫的路线,那么我看不出代理和障碍物之间的区别:两者都代表老鼠不能移动到的位置。我在这里错过了什么吗?
标签: java recursion multidimensional-array backtracking maze