如何解决迷宫不循环的BFS算法-Javascript
我正在尝试使用BFS算法来解决迷宫,我在一个数组中表示了迷宫,其中所有元素都以999开始,但中心(目标)为0。我试图使代码从0开始并划分出四种方式(北/南/东/西),如果该数字大于父数字,则在父数字上加1。初始循环的中间应该为0,并且四个相邻的像元应该从999更新为1。这应该循环直到算法到达位置0,0。不幸的是,我似乎无法运行循环-我可以将前四个元素更新为1,然后停止。我认为这与我的队列是/不被下一个循环的(y,x)输入有关,但是我似乎无法改变它。 这是一项任务,因此不要寻求解决方案,但会非常感谢您在帮助我了解循环中缺少的任何帮助。我在下面显示了数组代码(mazeD)和BFS /洪水代码
// maze array showing numerical distance
let mazeD = [];
for (let y = 0; y < 10; y++) {
let row = [];
for (let x = 0; x < 10; x++) {
row[x] = 999;
}
mazeD[y] = row;
}
mazeD[5][5] = 0;
// BFS function
function flood(x,y,d) {
let queue = []
queue.push([y,x]);
while (queue.length > 0) {
queue.shift();
let fillArr = [
[+y - 1,+x],[+y,+x - 1],+x + 1],[+y + 1,];
if ((x < 10) && (y < 10)) {
d++;
for (let [yy,xx] of fillArr) {
if (mazeD[yy][xx] > d) {
queue.push([yy,xx]);
mazeD[yy][xx] = d;
console.log("queue =" +queue)
}
}
}
}
}
flood(5,5,0);
console.log(mazeD);
解决方法
我认为您可能在此行中遇到问题:
queue.shift()
似乎您永远不会读取存储在队列中的值,因此循环中的坐标永远不会更新,这意味着您始终在检查相同的位置。您可能希望将queue.shift()
的值分配给变量,然后使用这些坐标继续搜索。
只要这样做:
let mazeD = [];
for (let y = 0; y < 10; y++) {
let row = [];
for (let x = 0; x < 10; x++) {
row[x] = 999;
}
mazeD[y] = row;
}
mazeD[5][5] = 0;
// BFS function
function flood(x,y,d) {
let queue = [];
let i = 0;
queue.push([y,x]);
while (i < queue.length) {
[x,y] = queue[i,i];
let fillArr = [
[+y - 1,+x],[+y,+x - 1],+x + 1],[+y + 1,];
if ((x < 10) && (y < 10) && x >=0 && y>=0)
{
for (let [yy,xx] of fillArr)
{
if(yy >=0 && yy < 10 && xx>=0 && xx<10)
{
if (mazeD[yy][xx] == 999)
{
queue.push([yy,xx]);
mazeD[yy][xx] = mazeD[y][x]+1;
console.log(xx,yy,mazeD[y][x]+1);
}
if(xx == 0 && yy == 0){
return;
}
}
}
}
i++;
}
}
flood(5,5,0);
console.log(mazeD);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。