Transcript lab16.ppt

Lab16
程序设计B班
2007-12-27
Maze 迷宫问题

设计一个applet, 在8*8个cell的board上寻找一条由左
上角(0,0)到右下角(7,7)的path (不要求最短)

board上的cell可以放置障碍mark, mark可以由用户点
击鼠标添加或移除

一条合法的path是由一组连续相邻(不包括对角)的cell
组成的, 须绕过所有的mark, 并且要求用序号把path
经过的cell给标出来.

如果maze无解, 给出” No path exists” 的提示


点击按钮ClearAll, 可以清楚Path和所有mark
进阶功能(不要求,有兴趣可以课后做):



如何使path不包含square形式的cell(不存在4个相邻的
cell)
如何找到Maze中的最短路径
New Mark随机生成mark(s), mark的数量由board右方
的选择按钮指定。如下图

提示:

可能用到的类:
Maze
 board为8*8的cell对象二维数组
 寻找path 对访问过的cell设置标记, 可以考虑递归
实现
Cell
 作mark 实现MouseListener; Graphics对象的
drawLine方法
 画path
可以为cell分配一个path中的序列号
Mark, Path…




提示:

Cell 可以用面板实现, 使用2个布尔变量和一个路径
ID(可选,在Maze中设置亦可):




marked 标志是否被mark
Visited 是否被访问过(寻找path时防止重复)
画mark 获取cell大小: panel 的getsize().width,
getsize().height, 用drawline画2个交叉斜线
Maze
 递归调用Findpath(row, col)





设置当前row,col所指cell为访问过
Findpath(row-1, col)
Findpath(row+1, col)
Findpath(row, col-1)
Findpath(row, col+1)