JS家伙/加尔斯!我的印象是,当在JavaScript中的2D数组中使用BFS时,我们可以直接在数组元素上标记“visited”:grid [i] [j] .visited = true,然后下次检查grid [i] [j]。访问,它将返回true。这是一段以这种方式工作的示例代码(随意运行它):
var findP = function(origin, grid) {
var q = [origin], count = 0;
grid[origin[0]][origin[1]].visited = true;
var arr = [[0, -1], [0, 1], [-1, 0], [1, 0]];
while(q.length > 0) {
var c = q.length;
count++;
while(c >= 0) {
var t = q.shift();
if (grid[t[0]][t[1]] === '#') {
return count;
}
for(var i = 0; i < arr.length; i++) {
var m = t[0] + arr[i][0];
if (m < 0 || m > grid.length - 1) {
continue;
}
var n = t[1] + arr[i][1];
if (n < 0 || n > grid[0].length - 1) {
continue;
}
if (grid[m][n] !== 'X' && !grid[m][n].visited) {
grid[m][n].visited = true;
q.push([m, n]);
}
}
c--;
}
}
return -1;
}
console.log(findP([1, 1],[['X','X','X','X','X'], ['X','*','X','O','X'],
['X','O','O','#','#'],['X','X','X','X','X']]))
上面的代码工作正常。但是,当我尝试这个时,它根本不起作用(无限循环警报。运行起来不会很有趣):
var shortestPath = function(arr) {
if (!arr || arr.length === 0) {
return -1;
}
var i, j, hasBen = false;
for (i = 0; i < arr.length; i++) {
for (j = 0; j < arr[i].length; j++) {
if (arr[i][j] === '*') {
hasBen = true;
break;
}
}
if (hasBen) {
break;
}
}
//(i, j) is where Ben is:
var steps = 0, helper = [[1, 0], [-1, 0], [0, 1], [0, -1]];
var q = [[i, j]], flag = false;
arr[i][j].visited = true;
console.log(arr[i][j].visited); // undefined
console.log(arr[0][0].visited); //undefined
while(q.length > 0) {
var counter = q.length;
steps++;
while(counter > 0) {
var temp = q.shift(); // temp = [i, j];
for (var x = 0; x < helper.length; x++) {
var t = helper[x];
var m = temp[0] + t[0];
var n = temp[1] + t[1];
if (m < 0 || m >= arr[0].length || n < 0 || n >= arr.length) {
continue;
}
if (!arr[m][n].visited) {
arr[m][n].visited = true;
if (arr[m][n] === '#') {
flag = true;
break;
}
if (arr[m][n] !== 'X') {
q.push([m, n]);
}
}
}
if (flag) {
break;
}
counter--;
}
}
return flag ? steps : -1;
}
shortestPath([['*', 'O', 'O', 'X'], ['X', 'X', 'O', 'X'], ['X', 'X', '#', 'X']]);
上面代码中的两个console.log()都记录了undefined,导致无限循环。但是,为什么第一个代码片段工作但第二个代码片段没有?在数组元素上附加.visited时,它们不一样吗?我很困惑。