import java.io.FileOutputStream;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Random;

public class maziness {

private int M;//行数

private int N;//列数

private int[] visitMatrix;//搜索是判断是否曾被访问过

private int[][] colMatrix;//保存要输出的的'|'矩阵

private int[][] rowMatrix;//保存要输出的的'_'矩阵

private Random random;//用来生成随机数,保证迷宫的复杂程度

public maziness(int M ,int N){

this.M=M;

this.N=N;

visitMatrix=new int[M*N];

colMatrix = new int[M][N+1];

rowMatrix = new int[M+1][N];

init(colMatrix,M,N+1);

init(rowMatrix,M+1,N);

for (int i=0;i

visitMatrix[i]=0;

random = new Random();

}

private void init(int matrix[][],int M ,int N){

for (int i=0;i

for (int j=0;j

matrix[i][j]=1;

}

//返回num周围可用的邻居,即没被访问过,也没到达边缘

private void availableNeigbers(ArrayList list,int num){

int allNeigber[]=new int[4];

if (num%N==1){

allNeigber[0]=num-N;

allNeigber[1]=num+N;

allNeigber[2]=num+1;

allNeigber[3]=-1;

}

else if (num%N==0){

allNeigber[0]=num-N;

allNeigber[1]=num+N;

allNeigber[2]=num-1;

allNeigber[3]=-1;

}

else{

allNeigber[0]=num-N;

allNeigber[1]=num+N;

allNeigber[2]=num-1;

allNeigber[3]=num+1;

}

for (int i=0;i<4;i++){

if (allNeigber[i]>0 & allNeigber[i]<=M*N)

if (visitMatrix[allNeigber[i]-1]==0 )

list.add(allNeigber[i]);

}

}

//返回随机选出的可用邻居

private int neigber(int num){

ArrayList list=new ArrayList();

availableNeigbers(list,num);

if (list.isEmpty())

return -1;

else{

return (Integer) list.get(random.nextInt(list.size()));

}

}

//移除num1和num2之间的墙

private void removeWall(int num1,int num2){

int x1=(num1+N-1)/N-1;

int y1=(num1-1)%N;

if (Math.abs(num1-num2)==1){

if (num1>num2)

colMatrix[x1][y1]=0;

else

colMatrix[x1][y1+1]=0;

}

else {

if (num1>num2)

rowMatrix[x1-1][y1]=0;

else

rowMatrix[x1][y1]=0;

}

}

//生成迷宫

public void process(){

ArrayList list=new ArrayList();

int curr=(M*N)/2;

visitMatrix[curr-1]=1;

list.add(curr);

int tmp;

while (!list.isEmpty()){

tmp=neigber(curr);

if (tmp>0){

visitMatrix[tmp-1]=1;

removeWall(curr,tmp);

curr=tmp;

list.add(curr);

}

else

curr=(Integer) list.remove(list.size()-1);

}

}

//绘制迷宫,并输出到txt文件中

public void draw(FileOutputStream fos){

try {

fos.write(' ');

fos.write(' ');

for (int i=0;i

fos.write(' ');

fos.write('_');

}

fos.write('\r');

for (int i=0;i

int j;

for (j=0;j

if (colMatrix[i][j]==1)

fos.write('|');

else

fos.write(' ');

if (rowMatrix[i][j]==1)

fos.write('_');

else

fos.write(' ');

}

if (i!=M-1 || j!=N){

fos.write('|');

fos.write('\r');

}

}

fos.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

try {

FileOutputStream fos=new FileOutputStream("F://maze.txt");

maziness m=new maziness(30,60);

m.process();

m.draw(fos);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println(e);

}

}

}

java迷宫生成代码_通过深度优先搜索产生的迷宫的Java代码相关推荐

  1. java深度优先迷宫生成_通过深度优先搜索产生的迷宫的Java代码

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. import java.io.FileOutputStream; import java. ...

  2. python解图片迷宫生成路径_用Python代码来解图片迷宫的方法整理

    译注:原文是StackOverflow上一个如何用程序读取迷宫图片并求解的问题,几位参与者热烈地讨论并给出了自己的代码,涉及到用python对图片的处理以及广度优先(BFS)算法等. 问题by Why ...

  3. 搜索功能java代码_简单的搜索框代码实现

    简单的搜索框页面功能的实现(代码如下) String path = request.getContextPath(); String basePath = request.getScheme()+&q ...

  4. 搜索重复代码_通过MappedByteBuffer搜索大文件

    此应用程序对于在不适合BufferedReader.files.readAllLines().files.lines()和Scanner的大文件中进行搜索非常有用. 我们将在这里讨论的解决方案基于Ja ...

  5. java自动生成类_自动生成优化的Java类专业知识

    java自动生成类 如果您今年访问过JavaOne,您可能已经参加了我的演讲"如何从数据库生成定制的Java 8代码". 在那次演讲中,我展示了如何使用Speedment Open ...

  6. java 编写代码_如果您在2016年编写过Java代码-这是您不容错过的趋势

    java 编写代码 2016年最有趣的Java相关主题 关于代码,有很多热门话题,而要跟上所有事情,这是一项全职的工作. 如果您想知道如何从谷壳中分离出小麦,我们已经为您完成了工作. 在下面的文章中, ...

  7. java代码_阿里资深工程师教你如何优化 Java 代码!

    作者 | 王超责编 | 伍杏玲 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层.着实用功,便见道无终穷,愈探愈深,必使精白无一毫不彻方可. 代码中的& ...

  8. leetcode 559. N 叉树的最大深度(Java版,N叉树的深度优先搜索)

    题目 https://leetcode-cn.com/problems/maximum-depth-of-n-ary-tree/ 题解 思路是 N 叉树的遍历(深度优先搜索) /* // Defini ...

  9. jtest java 代码_使用Jtest:一款优秀的 Java 代码优化和测试工具

    2.file>new>Project>Jtest>Create Project Specifying Source Folders. 这种方式允许开发测试人员自定义代码层次结构 ...

最新文章

  1. npm 安装less插件_2020 VSCode插件推荐
  2. 算法(6) —— AVL树
  3. Netty原理一:ServerBootstrap启动过程全解析
  4. m3u8地址_「波波带你手动提取网页视频」04讲 Network和Elements提取m3u8链接
  5. android 号码查联系人,Android联系人查询
  6. jQuery设计动画
  7. Spark提交 指定 kerberos 认证信息
  8. Win7系统默认浏览器的更改教程
  9. Linux学习笔记-Linux下读写文件
  10. [转]Python中下划线---完全解读
  11. 寻找安全漏洞?谨慎为之
  12. 比较JSF、Spring MVC、Stripes、Struts 2、Tapestry、Wicket
  13. Winform 实现像菜单一样弹出层
  14. 博弈论——人生就是在博弈
  15. 描述 J2EE 框架的多层结构,并简要说明各层的作用。
  16. 「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告
  17. 基于单片机的超市储物柜设计_基于51单片机的超市自动储物柜的设计,求大佬指点?...
  18. 几何画板中去除画出的线段的教程
  19. 【学习笔记】大数据搜索与挖掘
  20. IT忍者神龟之小程序最全的微信小程序项目实例

热门文章

  1. OS X 键盘快捷键
  2. OkHttp3源码解析(三)——连接池复用
  3. 关于intellij的配置安装
  4. Steps to configure Oracle 11g Data Guard Physical Standby – Active Data Guard Part-I
  5. 《React Native移动开发实战》一一3.4 完善商品列表——ListView组件
  6. Yoda 表示法错在哪里
  7. 关于工具类应用产品界面设计的一点思考
  8. 解惑解释性语言与编译性语言
  9. 安全:形式盖过内涵?
  10. 顺序表中有效元素的长度_408数据结构之顺序表进阶(1)