什么应该被视为 2D 或 3D 阵列的正确 DFS(深度优先搜索)算法输出?
What should be consider as a correct DFS (Depth First Search) algorithm output for 2D or 3D array?
我正在尝试 understand/learn DFS
(使用 TypeScript
)和 2D array
。我可以看到它可以有多个输出,但我不确定什么应该被视为有效输出。
问题:
- 这是一种有效的方法吗?如果是,这些输出是否都有效?
方法:
- 初始化堆栈。
- 初始化二维布尔数组,与原数组大小相同。为了避免遍历,进入循环。
- 将第一个元素位置(位于(0,0),行=0,列=0的元素)压入堆栈
- 现在直到栈不为空
- 从堆栈中弹出位置。用“,”分割得到行索引和列索引。并检查索引是否在给定矩阵的范围内并在 visited[] 数组中标记为 false,如果不在则忽略它并从堆栈中弹出下一个位置。如果索引有效且未被访问,则打印该元素。
- 标记访问数组中的元素
- 将当前元素从左、右、下、上的元素位置加入栈中。
示例: 此代码将产生第一个输出。如果你改变左,右,下和上,那么可以产生不同的输出。
var grid = [
[-1, 2, 3],
[0, 9, 8],
[1, 0, 1]
];
function DFSMatrix(grid){
var h = grid.length;
if (h == 0)
return;
var l = grid[0].length;
var visited = Array.from(Array(h), () => Array(l).fill(false));
var stack = [];
stack.push(0 + "," + 0);
while (stack.length != 0) {
var x = stack.pop();
var row = Number.parseInt(x.split(",")[0])
var col = Number.parseInt(x.split(",")[1]);
if (row < 0 || col < 0 || row >= h || col >= l || visited[row][col])
continue;
visited[row][col] = true;
var element = grid[row][col] + " ";
console.log(element);
// console.log(grid[row][col] + " ");
// result.push(element);
stack.push(row + "," + (col - 1)); //go left
stack.push(row + "," + (col + 1)); //go right
stack.push((row - 1) + "," + col); //go up
stack.push((row + 1) + "," + col); //go down
}
}
输出:
- 第一个输出:-1、0、1、0、9、2、3、8、1
- 第二个输出:-1、2、3、8、9、0、1、0、1
- 第三个输出:-1、0、1、0、1、8、9、2、3
如果BFS的目的是横穿整个图(数组)
输出是正确的。
一个有效的答案是概述最短路径的答案。示例中有多个等效的最短路径,因此有多个有效答案。
事实上,通过随机选择元素的方向(左、右、下、上),您将获得更多有效输出。
另一方面,如果目的是找到从源 (x1,y,1) 到目标 (x2,y2) 的最短路径,则需要更改算法:一旦到达目标搜索停止。
旁注:在将元素添加到堆栈之前“检查索引是否在给定矩阵的范围内”会更有效。
我正在尝试 understand/learn DFS
(使用 TypeScript
)和 2D array
。我可以看到它可以有多个输出,但我不确定什么应该被视为有效输出。
问题:
- 这是一种有效的方法吗?如果是,这些输出是否都有效?
方法:
- 初始化堆栈。
- 初始化二维布尔数组,与原数组大小相同。为了避免遍历,进入循环。
- 将第一个元素位置(位于(0,0),行=0,列=0的元素)压入堆栈
- 现在直到栈不为空
- 从堆栈中弹出位置。用“,”分割得到行索引和列索引。并检查索引是否在给定矩阵的范围内并在 visited[] 数组中标记为 false,如果不在则忽略它并从堆栈中弹出下一个位置。如果索引有效且未被访问,则打印该元素。
- 标记访问数组中的元素
- 将当前元素从左、右、下、上的元素位置加入栈中。
示例: 此代码将产生第一个输出。如果你改变左,右,下和上,那么可以产生不同的输出。
var grid = [
[-1, 2, 3],
[0, 9, 8],
[1, 0, 1]
];
function DFSMatrix(grid){
var h = grid.length;
if (h == 0)
return;
var l = grid[0].length;
var visited = Array.from(Array(h), () => Array(l).fill(false));
var stack = [];
stack.push(0 + "," + 0);
while (stack.length != 0) {
var x = stack.pop();
var row = Number.parseInt(x.split(",")[0])
var col = Number.parseInt(x.split(",")[1]);
if (row < 0 || col < 0 || row >= h || col >= l || visited[row][col])
continue;
visited[row][col] = true;
var element = grid[row][col] + " ";
console.log(element);
// console.log(grid[row][col] + " ");
// result.push(element);
stack.push(row + "," + (col - 1)); //go left
stack.push(row + "," + (col + 1)); //go right
stack.push((row - 1) + "," + col); //go up
stack.push((row + 1) + "," + col); //go down
}
}
输出:
- 第一个输出:-1、0、1、0、9、2、3、8、1
- 第二个输出:-1、2、3、8、9、0、1、0、1
- 第三个输出:-1、0、1、0、1、8、9、2、3
如果BFS的目的是横穿整个图(数组)
输出是正确的。
一个有效的答案是概述最短路径的答案。示例中有多个等效的最短路径,因此有多个有效答案。
事实上,通过随机选择元素的方向(左、右、下、上),您将获得更多有效输出。
另一方面,如果目的是找到从源 (x1,y,1) 到目标 (x2,y2) 的最短路径,则需要更改算法:一旦到达目标搜索停止。
旁注:在将元素添加到堆栈之前“检查索引是否在给定矩阵的范围内”会更有效。