迷宫问题

对于走迷宫,人们提出过很多计算机上的解法。深度优先搜索、广度优先搜索是使用最广的方法。生活中,人们更

愿意使用“紧贴墙壁,靠右行走”的简单规则。

58

下面的代码则采用了另一种不同的解法。它把走迷宫的过程比做“染色过程”。

假设入口点被染为红色,它的颜色会“传染”给与它相邻的可走的单元。

这个过程不断进行下去,如果最终出口点被染色,则迷宫有解。

仔细分析代码中的逻辑,填充缺少的部分。把填空的答案(仅填空处的答案,不包括题面)存入考生文件夹下对应

题号的“解答.txt”中即可。


  1. import java.util.HashSet;
  2. import java.util.Iterator;
  3. import java.util.Set;
  4. class Cell{ // 单元格
  5. int row; // 哪行
  6. int col; // 哪列
  7. Cell from; // 开始点
  8. public Cell(int row,int col,Cell from){
  9. this.row = row;
  10. this.col = col;
  11. this.from = from;
  12. }
  13. }
  14. public class T04 {
  15. static char[][] maze = {
  16. {'#','#','#','#','B','#','#','#','#','#','#','#'},
  17. {'#','#','#','#','.','.','.','.','#','#','#','#'},
  18. {'#','#','#','#','.','#','#','#','#','.','.','#'},
  19. {'#','.','.','.','.','#','#','#','#','#','.','#'},
  20. {'#','.','#','#','#','#','#','.','#','#','.','#'},
  21. {'#','.','#','#','#','#','#','.','#','#','.','#'},
  22. {'#','.','#','#','.','.','.','.','.','.','.','#'},
  23. {'#','.','#','#','.','#','#','#','.','#','.','#'},
  24. {'#','.','.','.','.','#','#','#','.','#','.','#'},
  25. {'#','#','.','#','.','#','#','#','.','#','.','A'},
  26. {'#','#','.','#','#','#','.','.','.','#','#','#'},
  27. {'#','#','#','#','#','#','#','#','#','#','#','#'}
  28. };
  29. // 显示迷宫
  30. public static void show(){
  31. for(int i=0;i<maze.length;i++){
  32. for(int j=0;j<maze[i].length;j++){
  33. System.out.print(" "+maze[i][j]);
  34. }
  35. System.out.println();
  36. }
  37. }
  38. // 染色
  39. public static Cell colorCell(Set<Cell> from,Set<Cell> desc){
  40. Iterator<Cell> iter = from.iterator();
  41. 59
  42. while(iter.hasNext()){
  43. Cell a = iter.next();
  44. Cell c[] = new Cell[4];
  45. c[0] = new Cell(a.row-1,a.col,a); // 向上走
  46. c[1] = new Cell(a.row+1,a.col,a); // 向下走
  47. c[2] = new Cell(a.row,a.col-1,a); // 向左走
  48. c[3] = new Cell(a.row,a.col+1,a); // 向右走
  49. for(int i=0;i<4;i++){
  50. if(c[i].row<0 || c[i].row>=maze.length) continue;
  51. if(c[i].col<0 || c[i].col>=maze[0].length) continue;
  52. char x = maze[c[i].row][c[i].col]; // 取得单元格对应字符
  53. if(x=='B') return a;
  54. if(x=='.'){
  55. maze[c[i].row][c[i].col] = '?'; // 染色
  56. desc.add(c[i]);
  57. }
  58. }
  59. }
  60. return null;
  61. }
  62. //
  63. public static void resolve(){
  64. Set<Cell> set = new HashSet<Cell>();
  65. set.add(new Cell(9,11,null));
  66. for(;;){
  67. Set<Cell> set1 = new HashSet<Cell>();
  68. // 出口 a.from.from.from.....<-(set.get(0).from)==null<-入口
  69. Cell a = colorCell(set,set1);
  70. if(a!=null){ // 找到解
  71. System.out.println("找到解!");
  72. while(a!=null){ // 当前a里包含a.from 一直往前推
  73. maze[a.row][a.col] = '+'; // 染色路径
  74. a = a.from;
  75. }
  76. break;
  77. }
  78. if(set1.isEmpty()){ // 遍历所以一直到没有路走,这时 set1为空
  79. System.out.println("无解!");
  80. break;
  81. }
  82. set = set1; // 向里边
  83. }
  84. }
  85. public static void main(String[] args){
  86. show();
  87. resolve();
  88. 60
  89. show();
  90. }
  91. }
  1. 运行结果:
  2. # # # # B # # # # # # #
  3. # # # # . . . . # # # #
  4. # # # # . # # # # . . #
  5. # . . . . # # # # # . #
  6. # . # # # # # . # # . #
  7. # . # # # # # . # # . #
  8. # . # # . . . . . . . #
  9. # . # # . # # # . # . #
  10. # . . . . # # # . # . #
  11. # # . # . # # # . # . A
  12. # # . # # # . . . # # #
  13. # # # # # # # # # # # #
  14. 找到解!
  15. # # # # B # # # # # # #
  16. # # # # + . . . # # # #
  17. # # # # + # # # # ? ? #
  18. # + + + + # # # # # ? #
  19. # + # # # # # ? # # ? #
  20. # + # # # # # ? # # ? #
  21. # + # # + + + + + + + #
  22. # + # # + # # # ? # + #
  23. # + + + + # # # ? # + #
  24. # # ? # ? # # # ? # + +
  25. # # ? # # # ? ? ? # # #
  26. # # # # # # # # # # # #

java实现迷宫问题的更多相关文章

  1. java版迷宫

    当年学数据结构,正好java也刚刚学会gui编程,就想着结合起来做个小东西,然后这个自动走路的小球就出来了. 一个方向的枚举Dir.java public enum Dir { L,U,R,D } 结 ...

  2. Java求解迷宫问题:栈与回溯算法

    摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1)  选择一个 ...

  3. 【译文】走出Java ClassLoader迷宫 Find a way out of the ClassLoader maze

    本文是一篇译文.原文:Find a way out of the ClassLoader maze 对于类加载器,普通Java应用开发人员不需要了解太多.但对于系统开发人员,正确理解Java的类加载器 ...

  4. Java实现迷宫城堡(强连通图的判定)

    1 问题描述 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单 ...

  5. java实现迷宫走法

    ** 迷宫走法** 迷宫问题 对于走迷宫,人们提出过很多计算机上的解法.深度优先搜索.广度优先搜索是使用最广的方法.生活中,人们更愿意使用"紧贴墙壁,靠右行走"的简单规则. 下面的 ...

  6. java使用链栈实现迷宫求解

    java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html java实现链栈的代码: package stackapplicatio ...

  7. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  8. Java迷宫游戏

    缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树 ...

  9. 小项目特供 简易迷宫(基于Java)

    明天返校,于是昨天和今天简单熟系了一下JAVA的GUI,做了一个简易的迷宫小游戏(暂时没有时间实现随机迷宫及多关卡,仅供学习) 源码及运行文件(提供JRE8):链接:简易迷宫 密码:hy8v

随机推荐

  1. javascript操作字符串间隔显示随机颜色

    参考了另一篇文章 https://www.cnblogs.com/zjfree/p/11584177.html,原理在这篇文章已经有详细描述了. 然后结合自己的一些js基础,当然改成jquery也可以 ...

  2. Winform GDI+绘图二:绘制旋转太极图

    大家好,今天有时间给大家带来Winform自绘控件的第二部分,也是比较有意思的一个控件:旋转太极图. 大家可以停下思考一下,如果让你来绘制旋转的太极图,大家有什么样的思路呢?我今天跟大家展示一下,我平 ...

  3. Apache Hudi典型应用场景知多少?

    1.近实时摄取 将数据从外部源如事件日志.数据库提取到Hadoop数据湖 中是一个很常见的问题.在大多数Hadoop部署中,一般使用混合提取工具并以零散的方式解决该问题,尽管这些数据对组织是非常有价值 ...

  4. java判断是否是合法IP

    public boolean ipCheck(String text) { if (text != null && !text.isEmpty()) { // 定义正则表达式 Stri ...

  5. oracle的操作-表空间

    查询以创建的表空间 select dbms_metadata.get_ddl('TABLESPACE','你的表空间名称') from dual; --查询空间创建的位置 select t1.name ...

  6. 博客营销(Blog Marketing)

    一.什么是博客营销 博客营销(Blog Marketing)的概念可以说并没有严格的定义,简单来说,就是利用博客这种网络应用形式开展网络营销.要说明什么是博客营销,首先要从什么是博客说起. 博客(Bl ...

  7. 王艳 201771010127《面向对象程序设计(java)》第十一周学习总结

    一:理论部分. 1.数据结构:分为a.线性数据结构,如线性表.栈.队列.串.数组和文件. b.非线性数据结构,如树和图. 1)所有数据元素在同一个线性表中必须是相同的数据类型. 线性表按其存储结构可分 ...

  8. HashMap的源码浅析

    一.HashMap 的数据结构 Java7 及之前主要是"数组+链表",到了 Java8 之后,就变成了"数组+链表+红黑树". 二.Java7 源码浅析: 在 ...

  9. 100道MySQL数据库经典面试题解析(收藏版)

    前言 100道MySQL数据库经典面试题解析,已经上传github啦 https://github.com/whx123/JavaHome/tree/master/Java面试题集结号 公众号:捡田螺 ...

  10. Python的多线程锁跟队列

    一.互斥锁: 1.线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁. 2.互斥锁为资源引入一个状态:锁定.非锁定 3.某个线程要更改共享数据是,先将其锁定.此时资源的状态为锁定, ...