第一范文网 - 专业文章范例文档资料分享平台

数据结构与算法课程设计报告-哈工大-应用不相交集合生成随即迷宫 - 图文

来源:用户分享 时间:2025/6/1 3:06:53 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

哈尔滨工业大学课程设计报告

3 算法实现

3.1 开发语言及工具

开发语言:JAVA 开发工具:eclipse

3.2 算法关键代码

3.2.1 构建随机迷宫算法关键代码

public void CreateMaze(int Maze[][]) { //生成随机迷宫,存在二维数组Maze中

int x,y,i,j,d,xt1,yt1,xt2,yt2,count = n*n; Init(); //初始化等价类

for(i = 0;i < wid;i++) { //初始化二维数组 }

for(i = 1;i < wid;i++) { //初始化二维数组 }

while(count > 1) { //循环至只有一个等价类结束

do {

x = (int)(Math.random()*wid); y = (int)(Math.random()*wid); if(i%2 == 1) { } else { }

for(j = 1;j < wid;j += 2) { }

Maze[i][j] = 1;

//1为墙

for(j = 1;j < wid;j += 2) { }

for(j = 2;j < wid;j += 2) { }

Maze[i][j] = 1;

//1为墙

Maze[i][j] = 5;

//5为格子

for(j = 0;j < wid;j++) { }

Maze[i][j] = 9;

//9为不可到达的点

}while(Maze[x][y] != 1); d = x%2; if(d == 0) {

yt1 = y; xt2 = x - 1; yt2 = y;

if(FindSet(postolist(xt1,yt1)) != FindSet(postolist(xt2,yt2))) {

Maze[x][y] = 0;

9

//墙为竖直方向的

xt1 = x + 1;

哈尔滨工业大学课程设计报告

}

}

}

}

UnionSet(postolist(xt1,yt1),postolist(xt2,yt2)); count--;

else { //墙为水平方向的 }

xt1 = x; yt1 = y + 1; xt2 = x; yt2 = y - 1;

if(FindSet(postolist(xt1,yt1)) != FindSet(postolist(xt2,yt2))) { }

Maze[x][y] = 0;

UnionSet(postolist(xt1,yt1),postolist(xt2,yt2)); count--;

int rank[] = new int[MAX]; //存储节点的层数

int parent[] = new int[MAX]; //存储相应节点的父节点 public void Init() { }

public int FindSet(int x) { }

public void UnionSet(int root1,int root2) { }

public int postolist(int x,int y) { }

10

//初始化等价类,一个格子为一个等价类

for(int i = 0;i < MAXSIZE;i++) { }

//找到二叉树的根节点

rank[i] = 0; parent[i] = i;

if(x != parent[x])

parent[x] = FindSet(parent[x]); return parent[x];

//合并等价类

int x = FindSet(root1); int y = FindSet(root2); if(x == y) return;

if(rank[x] > rank[y]) parent[y] = x; else { }

//将二维数组中(x,y)转化为一维数组对应的i

parent[x] = y;

if(rank[x] == rank[y]) ++rank[y];

return (x/2)*n + (y/2);

哈尔滨工业大学课程设计报告

3.2.2 寻找迷宫路径算法关键代码

public Stack getPath(){ //寻找迷宫路径,存储在栈中 }

11

Stack stackP = new Stack(); int x=1,y=1;

//起点坐标(1,1)

stackP.Push(1,1);

setBeen(x,y); //标记为已到达

do{

if(ableRight(x,y)){ //如果向右没有墙,则将右边格子压入栈 }

else if(ableLeft(x,y)){ }

else if(ableUp(x,y)){ //如果向上没有墙,则将上边格子压入栈 }

else if(ableDown(x,y)){ } else{ }

if(x == mazeSize - 1 && y == mazeSize -1){ //到达终点 }

else if(stackP.isEmpty()){ //未找到路径 }

stackP.Pop();

x = stackP.End().getX(); y = stackP.End().getY();

System.out.println(\); break; break; setBeen(x,y+2); y = y+2;

stackP.Push(x,y);

//如果向下没有墙,则将下边格子压入栈

setBeen(x,y-2); y = y-2;

stackP.Push(x,y); setBeen(x-2,y); x = x-2;

stackP.Push(x,y);

//如果向左没有墙,则将左边格子压入栈

setBeen(x+2,y); x = x+2;

stackP.Push(x,y);

}while(true);

return stackP;

哈尔滨工业大学课程设计报告

3.2.3 图形界面算法关键代码

public void paintComponent(Graphics g) { //画出迷宫和路径

}

super.paintComponent(g); Graphics2D g2 = (Graphics2D) g;

System.out.println(\为空?\+path.isEmpty());

Rectangle2D rect = new Rectangle2D.Double(RectleftX, RecttopY, RectWidth, g2.draw(rect); //画出迷宫边界

for(int i=1;i<=N-1;i=i+1){ //根据二维数组Maze画出迷宫 }

while(!path.isEmpty()){ }

//根据栈中内容画出路径

g2.draw(new Ellipse2D.Double(RectleftX + (path.End().getX()-1)*SIZE + path.Pop();

for(int j=1;j<=N-1;j=j+1){ }

if(isWall(Maze[i][j])){ }

if(i%2==0){ } else{ }

g2.draw(new Line2D.Double(RectleftX + SIZE*(i-1),

RecttopY +SIZE*(j),RectleftX + SIZE*(i+1), RecttopY +SIZE*(j)));

g2.draw(new Line2D.Double(RectleftX + SIZE*(i),

RecttopY +SIZE*(j-1),RectleftX + SIZE*(i),RecttopY + SIZE * (j+1)));

RectHeight);

SIZE/3 , RecttopY + (path.End().getY()-1)*SIZE + SIZE/3,2*SIZE/3, 2*SIZE/3));

3.3 主要功能界面

[按照主要功能分小节,自行增删。每个界面下需要有简短的文字说明] 3.3.1 XXX功能运行结果

主要截图及说明 3.3.2 XXX功能运行结果

主要截图及说明 3.3.3 XXX功能运行结果

主要截图及说明

12

数据结构与算法课程设计报告-哈工大-应用不相交集合生成随即迷宫 - 图文.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c0z0ah6qm2y8wrp6237wa_3.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top