初始化地图


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算法生成迷宫

  1. 生成2 * k + 1的迷宫,1表示墙,0表示路
  2. 随机选一个顶点,在该顶点上下左右随机抽取一个位置,如果没有访问过而且没有越界就选这个点生成迷宫
  3. 重复第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算法生成迷宫相关推荐

  1. C 语言 随机prim算法 生成迷宫

    使用 随机prim算法生成迷宫,效果如下: 随机prim迷宫生成算法思想: 1.普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不 ...

  2. c语言随机prim算法的迷宫生成,Prim算法生成迷宫

    初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...

  3. Python Prim 算法 生成迷宫

    之前,我们在另外一篇文章中使用Prim算法生成了一个完美迷宫,利用的是遍历网格的方法,这一次,我们要教教大家用遍历墙的方法生成,上一篇文章链接:Python Prim 算法 生成迷宫_Leleprog ...

  4. 随机Prim算法生成迷宫

    前言 以前写过一篇博客,用栈走迷宫,然后就想着自己生成迷宫,自己走,就上网查了查自动生成迷宫的算法,也是研究了好一会,才用代码实现了这个算法,采用的就是常见的随机Prim算法. 原理 参考博客:htt ...

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

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

  6. Kruskal与Prim算法生成最小树

    Kruskal算法适用于边稀疏的情形 Prim算法适用于边稠密的情形 点击:Kruskal算法的理解 书上的代码: n:图G上的顶点 e:G上的边数 vest:看是否属于同一连通分量的数组,数值相等则 ...

  7. Prime算法生成迷宫

    prime迷宫生成 结果展示 算法解析 实现代码 结果展示 算法解析 参考链接 Prime迷宫生成算法的原理: (1)初始地图所有位置均设为墙 (2)任意插入一个墙体进墙队列 (3)判断此时墙体是否可 ...

  8. 实验三:基于A*算法的迷宫

    实验要求: 1.迷宫随机生成 2.玩家走迷宫,留下足迹: 3.系统用A*算法寻路,输出路径 解决问题: 1.如何显示迷宫的图形界面: 2.如何生成随机的迷宫: 3.怎样移动游戏中走迷宫的"玩 ...

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

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

最新文章

  1. 使用Mpvue 使用 scroll-view 记录以及 页面设置弹窗后 页面滚动问题
  2. 系统架构设计:进程缓存和缓存服务,如何抉择?
  3. WP7版社交程序现真容,与Bing Map的完美结合。
  4. php 获取鼠标的坐标,如何实时获取鼠标的当前坐标-
  5. 【转载】【Python-ML】SKlearn库谱聚类SpectralClustering模型
  6. CPU方案简介 RK3308 - 智能音响
  7. C 网络库都干了什么?
  8. java每一个小时同步_Java同步块(synchronized block)使用详解
  9. Linux 网桥设置固定MAC
  10. 洛谷OJ P2356 弹珠游戏 维护前缀和
  11. c++的极乐净土的实现
  12. 计算机网络——TCP
  13. 总结一下自学到现在的学习方法感悟
  14. 【07月19日】指数估值排名
  15. mysql解析json_mysql解析简单json字符串
  16. 世界一流水平的中国 10 大顶尖科学家
  17. Java集合中的fail-fast快速失败机制
  18. mysql出现waiting_MySQL出现Waiting for table metadata lock的原因以及解决方法
  19. 1.6.6 解释器 Interpreter
  20. 计算机网络基础 IP头部报文;IP的分片;

热门文章

  1. Tomcat部署web应用的三种方式
  2. WebAssembly:面向Web的通用二进制和文本格式
  3. gvim 实现自动全文排版
  4. j2recover----最强大的jfs2文件恢复工具
  5. Android之多Activity一次性退出
  6. 理财周报,致歉还远远不够
  7. lzg_ad:使用Virtual PC 部署和测试XP Embedded 发布镜像
  8. .net开发框架比较
  9. 如何让Unity支持中文
  10. 判断一个点是否在RotatedRect中