初始化地图

function initMaze(r,c){

let row = new Array(2 * r + 1)

for(let i = 0; i < row.length; i++){

let column = new Array(2 * c + 1)

row[i] = column

for(let j = 0; j < column.length; j++){

row[i][j] = 1

}

}

for(let i = 0; i < r; i++){

for(let j = 0; j < c; j++){

row[2 * i + 1][2 * j + 1] = 0

}

}

console.log(row)

}

initMaze(3,3)

计算二维数组坐标位置

let arr = [

[0,0,0],

[0,0,0],

[0,0,0]

]

for(let i = 0; i < 9; i++){

let row = Math.floor(i / 3)

let column = i % 3

arr[row][column] = false

}

console.log(arr)

偏移量方向预制

let offset = [

{

x:-1,

y:0

},

{

x:1,

y:0

},

{

x:0,

y:-1

},

{

x:0,

y:1

}

]

let x = 0

let y = 0

for(let i = 0; i < offset.length; i++){

x = x + offset[i].x

y = y + offset[i].y

console.log(x,y)

}

随机数公式

1.  0-x之间的随机数:

Math.round(Math.random()*x);

2.  x至y之间的随机数

Math.round(Math.random()*(y-x)+x);

3.  1-x之间的随机数:

Math.ceil(Math.random()*x);

Prim算法

const INF = Number.MAX_SAFE_INTEGER

function findMinKey(graph,key,visited){

let min = INF

let minIndex

//找到候选边中成本最小的节点

for(let v = 0; v < graph.length; v++){

if(!visited[v] && key[v] < min){

min = key[v]

minIndex = v

}

}

return minIndex

}

const prim = (graph) => {

const visited = [],

key = [],

parent = [];

let {length} = graph;

for(let v = 0; v < length; v++){

visited[v] = false

key[v] = INF

}

//把到第一个顶点的权值初始化为0

key[0] = 0

parent[0] = -1

//根节点不需要比

for(let i = 0; i < length - 1; i++){

//找到成本最小边的顶点

let u = findMinKey(graph,key,visited)

//标记下该顶点已被访问

visited[u] = true;

//以及该顶点到对应其他顶点是不是成本最小的

//如果是那么就走到该顶点去

for(let v = 0; v < length; v++){

if(graph[u][v] && !visited[v] && graph[u][v] < key[v]) {

parent[v] = u

key[v] = graph[u][v]

}

}

}

return parent

}

const graph = [

[0,2,4,0,0,0],

[2,0,2,4,2,0],

[4,2,0,0,3,0],

[0,4,0,0,3,2],

[0,2,3,3,0,2],

[0,0,0,2,2,0]

]

const parent = prim(graph)

console.log('Edge Weight')

for (let i = 1; i < graph.length; i++) {

console.log(parent[i] + ' - ' + i + ' ' + graph[i][parent[i]]);

}

使用Prim算法生成迷宫

生成2 * k + 1的迷宫,1表示墙,0表示路

随机选一个顶点,在该顶点上下左右随机抽取一个位置,如果没有访问过而且没有越界就选这个点生成迷宫

重复第2步

function roadmap(r,c){

let map = []

let rLen = 2 * r + 1

let cLen = 2 * c + 1

for(let i = 0; i < rLen; i++){

map[i] = []

for(let j = 0; j < cLen; j++){

//生成0101的格式

if((i ^ (i - 1)) === 1 && (j ^ (j - 1)) === 1){

map[i][j] = 0

}else{

map[i][j] = 1

}

}

}

map[1][0] = 0;

map[2 * r - 1][2 * c] = 0;

return map

}

const MathUtil = {

randomInt(a = 0,b){

if(typeof b === 'undefined'){

return Math.floor(Math.random() * a)

} else {

return Math.floor(Math.random() * (b - a) + a)

}

}

}

function maze(map){

let row = map.length >> 1

let col = map[0].length >> 1

let size = row * col

let notAccessed = new Array(size).fill(0)

let accessed = []

let cur = MathUtil.randomInt(0,size)

let offsS = [-col,col,-1,1] //cur在notAccessed要走的偏移量

let offsR = [-1,1,0,0] //cur在map中row要走的偏移量

let offsC = [0,0,-1,1]//cur在map中col要走的偏移量

accessed.push(cur)

notAccessed[cur] = 1

while(accessed.length < size){

let tr = Math.floor(cur / row)

let tc = cur % col

let num = 0;

let pos = -1

//判断四周格子是不是可以走

while(num++ < 4){

let dir = MathUtil.randomInt(0,4)

nr = tr + offsR[dir]

nc = tc + offsC[dir]

if(nr >= 0 && nc >= 0 && nr < row && nc < col && notAccessed[cur + offsS[dir]] === 0){

pos = dir

break

}

}

if(pos < 0){

//堵死的情况

cur = accessed[MathUtil.randomInt(0,accessed.length)]

}else{

//可以走的情况

tr = 2 * tr + 1

tc = 2 * tc + 1

map[tr + offsR[pos]][tc + offsC[pos]] = 0

cur = cur + offsS[pos]

notAccessed[cur] = 1

accessed.push(cur)

}

}

return map

}

function geMaze(r,c){

return maze(roadmap(r,c))

}

C&plus;&plus;编程练习&lpar;10&rpar;----&OpenCurlyDoubleQuote;图的最小生成树&OpenCurlyDoubleQuote;(Prim算法、Kruskal算法)

1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...

图解最小生成树 - 普里姆&lpar;Prim&rpar;算法

我们在图的定义中说过,带有权值的图就是网结构.一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接 ...

图的最小生成树prim算法模板

用prim算法构建最小生成树适合顶点数据较少而边较多的图(稠密图) prim算法生成连通图的最小生成树模板伪代码: G为图,一般为全局变量,数组d为顶点与集合s的最短距离 Prim(G, d[]){ ...

最小生成二叉树-prim算法

1.prim算法:一种计算生成最小生成树的方法,它的每一步都会为一棵生长中的树添加一条边. 2.时间复杂度:

php生成迷宫和迷宫寻址算法实例

较之前的终于有所改善.生成迷宫的算法和寻址算法其实是一样.只是一个用了遍历一个用了递归.参考了网上的Mike Gold的算法. <?php //zairwolf z@cot8.com heade ...

PHP树生成迷宫及A&ast;自己主动寻路算法

PHP树生成迷宫及A*自己主动寻路算法 迷宫算法是採用树的深度遍历原理.这样生成的迷宫相当的细,并且死胡同数量相对较少! 随意两点之间都存在唯一的一条通路. 至于A*寻路算法是最大众化的一全自己主动寻 ...

UWP开发:自动生成迷宫&amp&semi;自动寻路算法(3)

+ , + ];//0<=x<=12 0<=y<=24 private static Random Rd = new Random(); 首先声明mazeMap存储数据,声明了 ...

生成最小树prim算法

最小生成树prim算法实现   ‘      ’最小生成树,就是权值(两点间直线的值)之和的最小值. 首先,要用二维数组记录点和权值.如上图所示无向图: int G[6][6];       G[1] ...

图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...

随机推荐

Params 方法参数

params,ref,out 方法参数 示例 在下面的方法使用中 OpenWindow(params object[] args) 传递的参数args添加了params修饰 public void O ...

WPF自定义控件之带倒计时的按钮--Button

1.说明 之前做过一个小项目,点击按钮,按钮进入倒计时无效状态,计时完成后,恢复原样,现在就实现该效果---带倒计时的按钮 2.效果 1)正常状态               2)MouseOver( ...

【转】Ubuntu安装基础教程

原文网址:http://teliute.org/linux/Ubsetup/lesson23/lesson23.html 二十三.安装Ubuntu14.04 返回目录 下一课 14.04 版安装与前面 ...

Codeforces 551D GukiZ and Binary Operations&lpar;矩阵快速幂&rpar;

Problem D. GukiZ and Binary Operations Solution 一位一位考虑,就是求一个二进制序列有连续的1的种类数和没有连续的1的种类数. 没有连续的1的二进制序列的 ...

String类扩展

String s1=new String("fsdfsd"); String s2=new String("fsdfsd"); String a1=" ...

Android 五大布局(LinearLayout、FrameLayout、AbsoulteLayout、RelativeLayout、TableLayout )

前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

20&period; Valid Parentheses - 括号匹配验证

Description: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determin ...

福州大学软件工程1816 &vert; W班 第8次作业&lbrack;团队作业&comma;随堂小测——校友录&rsqb;

作业链接 团队作业,随堂小测--校友录 评分细则 本次个人项目分数由两部分组成(博客分满分40分+程序得分满分60分) 博客和程序得分表 评分统计图 千帆竞发图 总结 旅法师:实现了更新,导出,查询, ...

linux command line send email

https://www.tecmint.com/send-email-attachment-from-linux-commandline/ https://stackoverflow.com/ques ...

ionic1实现热更新以版本检测更新安装包的方法

1.需要下载热更新插件:插件名称是cordova-hot-code-push 首先打开cli,执行命令 npm install -g cordova-hot-code-push-cli 此功能主要是为 ...

c语言随机prim算法的迷宫生成,Prim算法生成迷宫相关推荐

  1. prim算法_自动生成随机迷宫(1)prim算法

          "程序 = 数据  + 算法",一款好的作品不单单是代码的堆砌,还有其灵魂的部分,那就是算法:算法是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机 ...

  2. [迷宫中的算法实践]迷宫生成算法——Prim算法

    普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)), ...

  3. 实验三、prim算法生成迷宫,A*算法解迷宫(实验准备)

    目录 实验要求: 算法简介: prim算法: A*算法: 实验要求: 该项目的主要要求是:首先生成一个迷宫,要求随机生成.而生成迷宫有深度优先算法.prim算法.递归分割算法等.老师说建议使用prim ...

  4. c语言 迷宫深度遍历 算法,图的遍历迷宫生成算法浅析

    1. 引言 在平常的游戏中,我们常常会碰到随机生成的地图.这里我们就来看看一个简单的随机迷宫是如何生成. 2. 迷宫描述随机生成一个m * n的迷宫,可用一个矩阵maze[m][n]来表示,如图:   ...

  5. Logit Beta分布及其R语言随机模拟算法

    Logit Beta分布及其R语言随机模拟算法 Logit Beta分布 Logit Beta分布的采样算法 Logit Beta分布是一个在广义线性模型中时常遇到的分布,通常是作为模型算法的一个中间 ...

  6. python自动寻路算法_PHP生成迷宫及自动寻路算法详解

    如何使用PHP生成迷宫以及寻路求解?本文主要介绍了PHP生成迷宫及自动寻路算法,并对PHP生成迷宫及自动寻路算法详解.希望对大家有所帮助. 本文实例讲述了PHP树的深度编历生成迷宫及A*自动寻路算法. ...

  7. C语言 - 随机生成数字 和 汉字

    目录 0 写在前面 1 随机生成数字(整数 和 浮点数) 1.1 rand() 简析 本质 使用注意 rand()取值范围: 1.2 在 [ m, n ] 中随机取数(整 + 浮) 1.2.1 注意: ...

  8. ML之RF:利用Js语言设计随机森林算法【DT之CART算法(gain index)】并应用随机森林算法

    ML之RF:利用Js语言设计随机森林算法[DT之CART算法(gain index)]&并应用随机森林算法 目录 输出结果 设计思路 代码实现(部分代码) 输出结果 设计思路 代码实现(部分代 ...

  9. java寻优算法_模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径...

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

最新文章

  1. Docker(二):Dockerfile 使用介绍
  2. 通知中心NSNotificationCenter的使用
  3. 全球超算500强榜单更新:美国Summit居首,中国上榜227台
  4. 【MySQL】按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
  5. 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 2.)(python/c/c++版)(笔记)
  6. [转]COPY OR MOVE FILES AND FOLDERS USING OLE AUTOMATION
  7. 帝云CMS内容管理系统DiYunCMS v4.3.12
  8. 常用的 Windows 键
  9. oracle 查看锁表情况及数据库连接情况
  10. 强悍的命令行 —— echo、env($PATH)、sudo
  11. vue.js简单登录界面访问mysql_Vuejs实战项目:登陆页面
  12. c#之有参和无参构造函数,扩展方法
  13. 在美团,我从暑期实习到转正
  14. Ubuntu18.04安装教程及部分问题总结
  15. 网络编程day1-本地信息的获取
  16. 计算机专业毕业设计工作日志,计算机科学技术系毕业设计工作日志.doc
  17. cad编辑节点快捷键是什么_cad编辑节点快捷键是什么_cad进入块编辑快捷键是什么,Auto CAD进入块编辑快捷键是什么?......
  18. 为什么说汽车VIN码是汽车唯一的身份证
  19. java-对密码进行加密和验证的类
  20. 图片与文字排版-flex

热门文章

  1. 小学语文课堂教学三维目标的制定和落实—广安齐祥娥
  2. 软件设计师备考笔记(五)计算机网络
  3. iet世界总决赛英雄联盟
  4. 多人在线编辑文档 开发_字节跳动全资收购 “幕布”,与腾讯阿里竞逐在线文档市场...
  5. java文件被进程占用_java 文件删除失败(被进程占用)
  6. Git —— 版本控制
  7. xshell5重启mysql成功_LINUX重启MYSQL的命令
  8. 如何联系到微众银行在线客服和人工客服
  9. android 禁止屏幕黑屏,Android 禁止锁屏或黑屏
  10. Java中关键字、保留字和标识符