迷宫

来源:互联网 发布:mysql in 子查询原理 编辑:程序博客网 时间:2024/04/29 01:20


看到一个很经典算法,就记录下。

PS:感觉很像是bfs+链表。

import java.util.HashSet;import java.util.Iterator;import java.util.Set;//迷宫问题////对于走迷宫,人们提出过很多计算机上的解法。深度优先搜索、广度优先搜索是使用最广的方法。生活中,人们更愿意使用“紧贴墙壁,靠右行走”的简单规则。//下面的代码则采用了另一种不同的解法。它把走迷宫的过程比做“染色过程”。假设入口点被染为红色,它的颜色会“传染”给与它相邻的可走的单元。这个过程不断进行下去,如果最终出口点被染色,则迷宫有解。////仔细分析代码中的逻辑,填充缺少的部分。////把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应题号的“解答.txt”中即可。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<maze.length; i++){for(int j=0; j<maze[i].length; j++) System.out.printf("%-2c" , maze[i][j]);System.out.println();}}//把与from集合中相邻的可染色节点染色,被染色节点记入 dest//一旦发现出口将被染色,则返回当前的“传播源”节点public Cell colorCell(Set<Cell> from, Set<Cell> dest){Iterator<Cell> it = from.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] = new Cell(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<Cell> set = new HashSet<Cell>();set.add(new Cell(9,11,null));for(;;){Set<Cell> set1 = new HashSet<Cell>();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();}}