问题描述
我正在尝试使用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);