gpt4 book ai didi

JavaScript 迷宫求解器算法

转载 作者:技术小花猫 更新时间:2023-10-29 12:21:21 26 4
gpt4 key购买 nike

HTML

<div id="labirinth">
<form style="text-align:center" name="forma1" autocomplete="on">
<table style="margin:0 auto;">
<tr>
<td style="float:right;">Height:</td>
<td><input type="text" id="height" name="height" autofocus="autofocus" maxlength="2" size="6" /></td>
</tr>
<tr>
<td style="float:right;">Width:</td>
<td><input type="text" id="width" name="width" maxlength="2" size="6" /></td>
</tr>
</table>
</form>
<input type="button" alt="submit" onClick="datas();" value="New" style="margin-top:10px;" />
</div>
<pre id="out"></pre>

JavaScript

function datas() {

var height = parseInt(document.getElementById("height").value);
var width = parseInt(document.getElementById("width").value);

document.getElementById('out').innerHTML = display(maze(height,width));
}

function maze(x,y) {
var n=x*y-1;
if (n<0) {alert("Bad numbers!");return;}
var horiz=[];
for (var j= 0; j<x+1; j++) horiz[j]= [];
var verti=[];
for (var j= 0; j<y+1; j++) verti[j]= [];

var here= [Math.floor(Math.random()*x), Math.floor(Math.random()*y)];
var path= [here];
var unvisited= [];
for (var j= 0; j<x+2; j++) {
unvisited[j]= [];
for (var k= 0; k<y+1; k++)
unvisited[j].push(j>0 && j<x+1 && k>0 && (j != here[0]+1 || k != here[1]+1));
}
while (0<n) {
var potential= [[here[0]+1, here[1]], [here[0],here[1]+1],
[here[0]-1, here[1]], [here[0],here[1]-1]];
var neighbors= [];
for (var j= 0; j < 4; j++)
if (unvisited[potential[j][0]+1][potential[j][1]+1])
neighbors.push(potential[j]);
if (neighbors.length) {
n= n-1;
next= neighbors[Math.floor(Math.random()*neighbors.length)];
unvisited[next[0]+1][next[1]+1]= false;
if (next[0] == here[0])
horiz[next[0]][(next[1]+here[1]-1)/2]= true;
else
verti[(next[0]+here[0]-1)/2][next[1]]= true;
path.push(here= next);
} else
here= path.pop();
}
return ({x: x, y: y, horiz: horiz, verti: verti});
}

function display(m) {
var text= [];
for (var j= 0; j<m.x*2+1; j++) {
var line= [];
if (0 == j%2)
for (var k=0; k<m.y*4+1; k++)
if (0 == k%4)
line[k]= 'X';
else
if (j>0 && m.verti[j/2-1][Math.floor(k/4)])
line[k]= ' ';
else
line[k]= 'X';
else
for (var k=0; k<m.y*4+1; k++)
if (0 == k%4)
if (k>0 && m.horiz[(j-1)/2][k/4-1])
line[k]= ' ';
else
line[k]= 'X';
else
line[k]= ' ';
if (0 == j) line[1]=line[3]=' ',line[2]= '1';
if (m.x*2-1 == j) line[4*m.y]= '2';
text.push(line.join('')+'\r\n');

}
return text.join('');
}

我正在尝试在不使用 HTML 表格单元格的情况下使用 JavaScript 创建完全可用的迷宫生成器。现在我在这个迷宫的创建求解器上遇到了问题。

问题:我的代码需要使用哪种迷宫求解算法?我应该从什么开始?我不需要整个算法——我只需要关于是否可以在这个迷宫生成器中使用迷宫求解器的建议。

JSbin - http://jsbin.com/uwoyon/1

最佳答案

对于适用于您正在生成的迷宫的求解器,我建议使用 Dijkstra 算法。虽然我不确定 horiz 和 verti 参数如何定义迷宫结构,但 Dijkstra 的算法将适用于您的情况,从“1”旁边的单元格开始并从那里构建。

它的操作方式是用每个单元格与起始单元格之间的单元格数来标记它。对于 3x3 迷宫,第一个单元格是:

x 1 xxxxxxxxx
x 1 x
x xxxxxxxxx
x x
x xxxxxxxxx
x 2
xxxxxxxxxxxxx

从标记的单元格开始检查是否有一个空的相邻单元格(没有被墙阻挡的单元格),将单元格值增加 1。对所有空单元格重复此过程:

x 1 xxxxxxxxx
x 1 2 3 x
x xxxxxxxxx
x 2 3 4 x
x xxxxxxxxx
x 3 4 5 2
xxxxxxxxxxxxx

现在从与末尾“2”相邻的单元格开始逆向计算。这表明解有一条长度为 5 步的路径,所以从 5 开始,找到相邻的 4,然后是 3,等等。回到 1。

注意:我推荐使用队列来标记单元格的递归解决方案:

1- 用“1”标记第一个单元格并将其放入队列中。

2- 从队列中取出信元: - 检查合法邻居(未被墙阻挡的邻居)是否未标记。 - 如果相邻单元格未标记,则用当前单元格+1 标记它。 - 将相邻小区添加到队列中。 - 对所有 4 个潜在邻居重复

3- 重复步骤 1 和 2,直到不再有未标记的细胞。

编辑:这是fiddle对于使用我建议的求解器,它与问题中的迷宫生成器无关,所以除非被问到,否则我不会详细介绍它是如何操作的(它有点粗糙,但它的实现应该很容易理解).

关于JavaScript 迷宫求解器算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16173259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com