使用 BFS 遍历二维矩阵
Traversing a 2D Matrix using BFS
我希望有人能帮助我。我正在尝试使用 JavaScript.
在二维矩阵上实现 BFS
该函数有一个二维矩阵(“lot”)的输入,其单元格为 1 或 0。遍历应该寻找其 INT 9 的目的地,并且只能遍历 INT 1。它不应该能够遍历 0,或者我标记为 -1 的已访问单元格。一旦到达目的地,它应该 return 找到目的地所花费的移动次数。在下面的示例中,它将是 3,因为需要 3 次移动才能从 0,0 位置(即起点)到达 9。
我总是收到越界错误,或者完全是错误的答案。我看了这么多代码,了解别人的观点真的很有帮助。
@input
let lot = [
[1, 0, 0],
[1, 0, 0],
[1, 9, 0]
];
function distanceTraversed(lot) {
let queue = [[0,0]];
let count = 0;
while (queue.length > 0) {
let directions = queue.shift();
let i = directions[0];
let j = directions[1];
if (lot[i][j] === 9) {
return count;
}
//moving up
if (i > 0 && lot[i][j] > 0) {
queue.push([i - 1, j]);
}
//moving down
if (i <= lot.length && lot[i][j] > 0) {
queue.push([i + 1, j]);
}
//moving left
if (j > 0 && lot[i][j] > 0) {
queue.push([i, j - 1]);
}
//moving right
if (j <= lot[i].length && lot[i][j] > 0) {
queue.push([i, j + 1]);
}
//setting visited cells
lot[i][j] = -1;
}
count++
return -1;
}
我会更改 queue
的结构并在索引零处添加计数。
然后我会更改对索引和即将到来的值的检查,以防止再次访问已访问的单元格。
function distanceTraversed(lot) {
const queue = [[0, 0, 0]];
while (queue.length) {
let [count, i, j] = queue.shift();
if (lot[i][j] === 9) return count;
if (lot[i][j] === -1) continue;
//setting visited cells
lot[i][j] = -1;
//moving up
if (i > 0 && lot[i - 1][j] !== -1) queue.push([count + 1, i - 1, j]);
//moving down
if (i + 1 < lot.length && lot[i + 1][j] !== -1) queue.push([count + 1, i + 1, j]);
//moving left
if (j > 0 && lot[i][j - 1] !== -1) queue.push([count + 1, i, j - 1]);
//moving right
if (j + 1 < lot[i].length && lot[i][j + 1] !== -1) queue.push([count + 1, i, j + 1]);
}
return -1;
}
let lot = [[1, 0, 0], [1, 0, 0], [1, 9, 0]];
console.log(distanceTraversed(lot));
我希望有人能帮助我。我正在尝试使用 JavaScript.
在二维矩阵上实现 BFS该函数有一个二维矩阵(“lot”)的输入,其单元格为 1 或 0。遍历应该寻找其 INT 9 的目的地,并且只能遍历 INT 1。它不应该能够遍历 0,或者我标记为 -1 的已访问单元格。一旦到达目的地,它应该 return 找到目的地所花费的移动次数。在下面的示例中,它将是 3,因为需要 3 次移动才能从 0,0 位置(即起点)到达 9。
我总是收到越界错误,或者完全是错误的答案。我看了这么多代码,了解别人的观点真的很有帮助。
@input
let lot = [
[1, 0, 0],
[1, 0, 0],
[1, 9, 0]
];
function distanceTraversed(lot) {
let queue = [[0,0]];
let count = 0;
while (queue.length > 0) {
let directions = queue.shift();
let i = directions[0];
let j = directions[1];
if (lot[i][j] === 9) {
return count;
}
//moving up
if (i > 0 && lot[i][j] > 0) {
queue.push([i - 1, j]);
}
//moving down
if (i <= lot.length && lot[i][j] > 0) {
queue.push([i + 1, j]);
}
//moving left
if (j > 0 && lot[i][j] > 0) {
queue.push([i, j - 1]);
}
//moving right
if (j <= lot[i].length && lot[i][j] > 0) {
queue.push([i, j + 1]);
}
//setting visited cells
lot[i][j] = -1;
}
count++
return -1;
}
我会更改 queue
的结构并在索引零处添加计数。
然后我会更改对索引和即将到来的值的检查,以防止再次访问已访问的单元格。
function distanceTraversed(lot) {
const queue = [[0, 0, 0]];
while (queue.length) {
let [count, i, j] = queue.shift();
if (lot[i][j] === 9) return count;
if (lot[i][j] === -1) continue;
//setting visited cells
lot[i][j] = -1;
//moving up
if (i > 0 && lot[i - 1][j] !== -1) queue.push([count + 1, i - 1, j]);
//moving down
if (i + 1 < lot.length && lot[i + 1][j] !== -1) queue.push([count + 1, i + 1, j]);
//moving left
if (j > 0 && lot[i][j - 1] !== -1) queue.push([count + 1, i, j - 1]);
//moving right
if (j + 1 < lot[i].length && lot[i][j + 1] !== -1) queue.push([count + 1, i, j + 1]);
}
return -1;
}
let lot = [[1, 0, 0], [1, 0, 0], [1, 9, 0]];
console.log(distanceTraversed(lot));