将“访问”标记为呈现矛盾结果的javascript数组元素

时间:2017-06-29 17:20:26

标签: javascript arrays

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时,它们不一样吗?我很困惑。

0 个答案:

没有答案