Prim算法生成迷宫
初始化地图
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] = columnfor(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 % 3arr[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 = 0for(let i = 0; i < offset.length; i++){x = x + offset[i].xy = y + offset[i].yconsole.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_INTEGERfunction findMinKey(graph,key,visited){let min = INFlet 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] = falsekey[v] = INF}//把到第一个顶点的权值初始化为0key[0] = 0parent[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] = ukey[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 + 1let cLen = 2 * c + 1for(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 >> 1let col = map[0].length >> 1let size = row * collet 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] = 1while(accessed.length < size){let tr = Math.floor(cur / row)let tc = cur % collet 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 = dirbreak }}if(pos < 0){//堵死的情况cur = accessed[MathUtil.randomInt(0,accessed.length)]}else{//可以走的情况tr = 2 * tr + 1tc = 2 * tc + 1map[tr + offsR[pos]][tc + offsC[pos]] = 0cur = cur + offsS[pos]notAccessed[cur] = 1accessed.push(cur)}}return map
}function geMaze(r,c){return maze(roadmap(r,c))
}
转载于:https://www.cnblogs.com/pluslius/p/10878282.html
Prim算法生成迷宫相关推荐
- C 语言 随机prim算法 生成迷宫
使用 随机prim算法生成迷宫,效果如下: 随机prim迷宫生成算法思想: 1.普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不 ...
- c语言随机prim算法的迷宫生成,Prim算法生成迷宫
初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...
- Python Prim 算法 生成迷宫
之前,我们在另外一篇文章中使用Prim算法生成了一个完美迷宫,利用的是遍历网格的方法,这一次,我们要教教大家用遍历墙的方法生成,上一篇文章链接:Python Prim 算法 生成迷宫_Leleprog ...
- 随机Prim算法生成迷宫
前言 以前写过一篇博客,用栈走迷宫,然后就想着自己生成迷宫,自己走,就上网查了查自动生成迷宫的算法,也是研究了好一会,才用代码实现了这个算法,采用的就是常见的随机Prim算法. 原理 参考博客:htt ...
- 实验三、prim算法生成迷宫,A*算法解迷宫(实验准备)
目录 实验要求: 算法简介: prim算法: A*算法: 实验要求: 该项目的主要要求是:首先生成一个迷宫,要求随机生成.而生成迷宫有深度优先算法.prim算法.递归分割算法等.老师说建议使用prim ...
- Kruskal与Prim算法生成最小树
Kruskal算法适用于边稀疏的情形 Prim算法适用于边稠密的情形 点击:Kruskal算法的理解 书上的代码: n:图G上的顶点 e:G上的边数 vest:看是否属于同一连通分量的数组,数值相等则 ...
- Prime算法生成迷宫
prime迷宫生成 结果展示 算法解析 实现代码 结果展示 算法解析 参考链接 Prime迷宫生成算法的原理: (1)初始地图所有位置均设为墙 (2)任意插入一个墙体进墙队列 (3)判断此时墙体是否可 ...
- 实验三:基于A*算法的迷宫
实验要求: 1.迷宫随机生成 2.玩家走迷宫,留下足迹: 3.系统用A*算法寻路,输出路径 解决问题: 1.如何显示迷宫的图形界面: 2.如何生成随机的迷宫: 3.怎样移动游戏中走迷宫的"玩 ...
- [迷宫中的算法实践]迷宫生成算法——Prim算法
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)), ...
最新文章
- 使用Mpvue 使用 scroll-view 记录以及 页面设置弹窗后 页面滚动问题
- 系统架构设计:进程缓存和缓存服务,如何抉择?
- WP7版社交程序现真容,与Bing Map的完美结合。
- php 获取鼠标的坐标,如何实时获取鼠标的当前坐标-
- 【转载】【Python-ML】SKlearn库谱聚类SpectralClustering模型
- CPU方案简介 RK3308 - 智能音响
- C 网络库都干了什么?
- java每一个小时同步_Java同步块(synchronized block)使用详解
- Linux 网桥设置固定MAC
- 洛谷OJ P2356 弹珠游戏 维护前缀和
- c++的极乐净土的实现
- 计算机网络——TCP
- 总结一下自学到现在的学习方法感悟
- 【07月19日】指数估值排名
- mysql解析json_mysql解析简单json字符串
- 世界一流水平的中国 10 大顶尖科学家
- Java集合中的fail-fast快速失败机制
- mysql出现waiting_MySQL出现Waiting for table metadata lock的原因以及解决方法
- 1.6.6 解释器 Interpreter
- 计算机网络基础 IP头部报文;IP的分片;