zoukankan      html  css  js  c++  java
  • java实现迷宫问题

    迷宫问题
    对于走迷宫,人们提出过很多计算机上的解法。深度优先搜索、广度优先搜索是使用最广的方法。生活中,人们更
    愿意使用“紧贴墙壁,靠右行走”的简单规则。
    58
    下面的代码则采用了另一种不同的解法。它把走迷宫的过程比做“染色过程”。
    假设入口点被染为红色,它的颜色会“传染”给与它相邻的可走的单元。
    这个过程不断进行下去,如果最终出口点被染色,则迷宫有解。
    仔细分析代码中的逻辑,填充缺少的部分。把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应
    题号的“解答.txt”中即可。

    
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    class Cell{ // 单元格
    int row; // 哪行
    int col; // 哪列
    Cell from; // 开始点
    public Cell(int row,int col,Cell from){
    this.row = row;
    this.col = col;
    this.from = from;
    }
    }
    public class T04 {
    static char[][] maze = {
    {'#','#','#','#','B','#','#','#','#','#','#','#'},
    {'#','#','#','#','.','.','.','.','#','#','#','#'},
    {'#','#','#','#','.','#','#','#','#','.','.','#'},
    {'#','.','.','.','.','#','#','#','#','#','.','#'},
    {'#','.','#','#','#','#','#','.','#','#','.','#'},
    {'#','.','#','#','#','#','#','.','#','#','.','#'},
    {'#','.','#','#','.','.','.','.','.','.','.','#'},
    {'#','.','#','#','.','#','#','#','.','#','.','#'},
    {'#','.','.','.','.','#','#','#','.','#','.','#'},
    {'#','#','.','#','.','#','#','#','.','#','.','A'},
    {'#','#','.','#','#','#','.','.','.','#','#','#'},
    {'#','#','#','#','#','#','#','#','#','#','#','#'}
    };
    // 显示迷宫
    public static void show(){
    for(int i=0;i<maze.length;i++){
    for(int j=0;j<maze[i].length;j++){
    System.out.print(" "+maze[i][j]);
    }
    System.out.println();
    }
    }
    // 染色
    public static Cell colorCell(Set<Cell> from,Set<Cell> desc){
    Iterator<Cell> iter = from.iterator();
    59
    while(iter.hasNext()){
    Cell a = iter.next();
    Cell c[] = new Cell[4];
    c[0] = new Cell(a.row-1,a.col,a); // 向上走
    c[1] = new Cell(a.row+1,a.col,a); // 向下走
    c[2] = new Cell(a.row,a.col-1,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] = '?'; // 染色
    desc.add(c[i]);
    }
    }
    }
    return null;
    }
    // 
    public static void resolve(){
    Set<Cell> set = new HashSet<Cell>();
    set.add(new Cell(9,11,null));
    for(;;){
    Set<Cell> set1 = new HashSet<Cell>();
    // 出口 a.from.from.from.....<-(set.get(0).from)==null<-入口
    Cell a = colorCell(set,set1);
    if(a!=null){ // 找到解
    System.out.println("找到解!");
    while(a!=null){ // 当前a里包含a.from 一直往前推
    maze[a.row][a.col] = '+'; // 染色路径
    a = a.from;
    }
    break;
    }
    if(set1.isEmpty()){ // 遍历所以一直到没有路走,这时 set1为空
    System.out.println("无解!");
    break;
    }
    set = set1; // 向里边
    }
    }
    public static void main(String[] args){
    show();
    resolve();
    60
    show();
    }
    }
    
    
    运行结果:
    # # # # B # # # # # # #
    # # # # . . . . # # # #
    # # # # . # # # # . . #
    # . . . . # # # # # . #
    # . # # # # # . # # . #
    # . # # # # # . # # . #
    # . # # . . . . . . . #
    # . # # . # # # . # . #
    # . . . . # # # . # . #
    # # . # . # # # . # . A
    # # . # # # . . . # # #
    # # # # # # # # # # # #
    找到解!
    # # # # B # # # # # # #
    # # # # + . . . # # # #
    # # # # + # # # # ? ? #
    # + + + + # # # # # ? #
    # + # # # # # ? # # ? #
    # + # # # # # ? # # ? #
    # + # # + + + + + + + #
    # + # # + # # # ? # + #
    # + + + + # # # ? # + #
    # # ? # ? # # # ? # + +
    # # ? # # # ? ? ? # # #
    # # # # # # # # # # # #
    
  • 相关阅读:
    Windows API 中 OVERLAPPED 结构体 初始化
    QString 转换成 wchar 的一个小陷阱
    Windows VHD Create, Attach, 获得Disk序号
    Programmatically mount a Microsoft Virtual Hard Drive (VHD)
    chcp437 转换英语,在西班牙语系统中无效
    Windows 版本 Enterprise、Ultimate、Home、Professional
    openssl 查看证书
    Ubuntu 搜索文件
    微软的 Sysinternals 系统管理工具包,例如可找出自动启动的流氓软件
    HTML 表格实例
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947196.html
Copyright © 2011-2022 走看看