迷宫算法(JAVA实现)
对于走迷宫,人们提出过很多计算机上的解法。深度优先搜索、广度优先搜索是使用最广的方法。生活中,人们更愿意使用“紧贴墙壁,靠右行走”的简单规则。
下面的代码则采用了另一种不同的解法。它把走迷宫的过程比做“染色过程”。假设入口点被染为红色,它的颜色会“传染”给与它相邻的可走的单元。这个过程不断进行下去,如果最终出口点被染色,则迷宫有解。
在以下程序中“#”代表不可通过,“.”代表可以通过。
public class Maze
{
class Cell//内部类
{
private int row;
private int col;
private Cell from;//指向父节点
public Cell(int row, int col, Cell from)
{
this.row = row;
this.col = col;
this.from = from;
}
}
char[][] maze =
{{'#','#','#','#','B','#','#','#','#','#','#','#'},
{'#','#','#','#','.','.','.','.','#','#','#','#'},
{'#','#','#','#','.','#','#','#','#','.','.','#'},
{'#','.','.','.','.','#','#','#','#','#','.','#'},
{'#','.','#','#','#','#','#','.','#','#','.','#'},
{'#','.','#','#','#','#','#','.','#','#','.','#'},
{'#','.','#','#','.','.','.','.','.','.','.','#'},
{'#','.','#','#','.','#','#','#','.','#','.','#'},
{'#','.','.','.','.','#','#','#','.','#','.','#'},
{'#','#','.','#','.','#','#','#','.','#','.','A'},
{'#','#','.','#','#','#','.','.','.','#','#','#'},
{'#','#','#','#','#','#','#','#','#','#','#','#'}};
public void show()
{
for(int i=0; i { for(int j=0; j System.out.print(" " + maze[i][j]); System.out.println(); } } //把与from集合中相邻的可染色节点染色,被染色节点记入 dest //一旦发现出口将被染色,则返回当前的“传播源”节点 public Cell colorCell(Set { Iterator while(it.hasNext()) { Cell a = it.next(); Cell[] c = new Cell[4]; c[0] = new Cell(a.row-1, a.col, a); //向上 c[1] = new Cell(a.row, a.col-1, a); //向左 c[2] = new Cell(a.row+1, a.col, a); //向下 c[3] = newCell(a.row, a.col+1, a); //向右 for(int i=0; i<4; i++) { if(c[i].row < 0 || c[i].row >= maze.length)continue; if(c[i].col < 0 || c[i].col >= maze[0].length)continue; char x = maze[c[i].row][c[i].col]; if(x=='B') return a; if(x=='.') { maze[c[i].row][c[i].col] = '?';//对可通过路径进行标记 dest.add(c[i]); } } } return null; } public void resolve() { Set set.add(new Cell(9,11,null)); for(;;) { Set Cell a = colorCell(set, set1); if(a!=null) { System.out.println("找到解!"); while(a!=null) { maze[a.row][a.col] = '+';//标出通路路径 a =a.from; } break; } if(set1.isEmpty()) { System.out.println("无解!"); break; } set = set1; } } public static void main(String[] args) { Maze m = new Maze(); m.show(); m.resolve(); m.show(); } } 程序的输出结果为:"+"代表通路