老鼠走迷宫算法

acyexin 2010-02-28 11:11:15
今天看了下老鼠走迷宫这个算法,只理解了选择一条路径的递归算法,但是对于选择出所有路径的算法没搞清楚,我给出一条路径算法的代码及详细注释,希望能抛砖引玉,引出大虾们对于求所有路径的带详细注释的代码!

题目:老鼠走迷宫
有个迷宫,2表示墙,0表示该点可以走,给出起始点和终结点,求出一条能走通的路径

public class Mouse {

private int startI, startJ; // 入口
private int endI, endJ; // 出口
private boolean success = false;

public static void main(String[] args)

{ //迷宫 2表示墙 0表示可走
int[][] maze = {{2, 2, 2, 2, 2, 2, 2},
{2, 0, 0, 0, 0, 0, 2},
{2, 0, 2, 0, 2, 0, 2},
{2, 0, 0, 0, 0, 2, 2},
{2, 2, 0, 2, 0, 2, 2},
{2, 0, 0, 0, 0, 0, 2},
{ 2, 2, 2, 2, 2, 2, 2}};

System.out.println("显示迷宫:");
for(int i = 0; i < maze.length; i++)
{
for(int j = 0; j < maze[0].length; j++)
{
if(maze[i][j] == 2)
{
System.out.print("██");
}
else
{
System.out.print(" ");
}
}
System.out.println();
}

Mouse mouse = new Mouse();
mouse.setStart(1, 1);
mouse.setEnd(5, 5);

if(!mouse.go(maze))
{
System.out.println("\n没有找到出口!");
}
else
{ //打印出选择的路线
System.out.println("\n找到出口!");
for(int i = 0; i < maze.length; i++)
{
for(int j = 0; j < maze[0].length; j++)
{
if(maze[i][j] == 2)
{
System.out.print("██");
}
else if(maze[i][j] == 1)
{
System.out.print("$$");
}
else
{
System.out.print(" ");
}
}
System.out.println();
}
}
}

public void setStart(int i, int j)
{
this.startI = i;
this.startJ = j;
}

public void setEnd(int i, int j)
{
this.endI = i;
this.endJ = j;
}

public boolean go(int[][] maze)
{
return visit(maze, startI, startJ);
}
//核心算法 递归
private boolean visit(int[][] maze, int i, int j)
{ //该点已走过,设置为1
maze[i][j] = 1;

if(i == endI && j == endJ)
{ //到达结尾 返回成功
success = true;
}
//第一选择向右边走(右边如果已经走过 不再继续走 下同)
if(!success && maze[i][j+1] == 0)
{
visit(maze, i, j+1);
}
//第二选择向下走
if(!success && maze[i+1][j] == 0)
{
visit(maze, i+1, j);
}
//第三选择向左走
if(!success && maze[i][j-1] == 0)
{
visit(maze, i, j-1);
}
//第四选择向右边走
if(!success && maze[i-1][j] == 0)
{
visit(maze, i-1, j);
}

if(!success)
{//无路可走 将该点重新标志为0
maze[i][j] = 0;
}

return success;
}


}


扩展问题是老鼠走迷宫的所有路径,这个我没看明白,有哪位大虾有兴趣的写个带注释的发上来看看

...全文
765 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
whyoyyx 2011-04-09
  • 打赏
  • 举报
回复
版主貌似没考虑数组的越界问题!
Raul91 2010-12-22
  • 打赏
  • 举报
回复
好的 很好 课程设计正好借鉴一下 嘿嘿
wenli103 2010-03-07
  • 打赏
  • 举报
回复
guodong66 2010-03-01
  • 打赏
  • 举报
回复
以为是好玩的问题,好多字额
钱不是问题 2010-03-01
  • 打赏
  • 举报
回复
显示迷宫:
██████████████
██ ██
██ ██ ██ ██
██ ████
████ ██ ████
██ ██
██████████████

找到出口!
██████████████
██$$$$$$ ██
██ ██$$██ ██
██ $$$$████
████ ██$$████
██ $$$$██
██████████████
zliuzz 2010-03-01
  • 打赏
  • 举报
回复
所有的路径 就是把你这个递归完全运行完而已
如果只找到一条路 你的递归可以在找到路的时候就停止了
vcshcn 2010-03-01
  • 打赏
  • 举报
回复
没看程序。找到所有迷宫道路就是 push堆栈时把所有相邻点都推进去,而不是一个一个push seek
zhangnew 2010-02-28
  • 打赏
  • 举报
回复
这么长,俺晕了,接分帮顶

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧