问题描述
我正在尝试通过 DFS
理解/学习 TypeScript
(使用 2D array
)。我可以看到它可以有多个输出,但我不确定应该将什么视为有效输出。
问题:
方法:
- 初始化堆栈。
- 初始化二维布尔数组,大小与原始数组相同。为了避免遍历,进入循环。
- 将第一个元素位置(元素在 (0,0),row=0,column=0)压入堆栈
- 现在直到栈不为空
示例:此代码将产生第一个输出。如果你改变左、右、下和上,就会产生不同的输出。
var grid = [
[-1,2,3],[0,9,8],[1,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,1
- 第三个输出:-1,3
解决方法
如果BFS的目的是横穿整个图(数组)
输出正确。
一个有效的答案是概述最短路径的答案。示例中有多个等效的最短路径,因此有多个有效答案。
事实上,通过随机化选择元素的方向(左、右、下、上),你会得到更多的有效输出。
另一方面,如果目的是找到从源 (x1,y,1) 到目标 (x2,y2) 的最短路径,则需要更改算法:一旦到达目标,搜索就会停止.
旁注:在将元素添加到堆栈之前“检查索引是否在给定矩阵的范围内”会更有效。