let mat = [
[1, 1, 0],
[1, 1, 1],
[0, 1, 1]
]
let dp = []
let m=mat.length,n=mat[0].length
for (let i = 0; i < m; i++) {
let temp = []
for (let j = 0; j < n; j++) {
if (mat[i][j] === 0) {
temp.push(0)
} else {
temp.push(Infinity)
}
}
dp.push(temp)
}
//为什么不上下或左右 是因为dp的状态是由以前的状态推导而来 怎么做到遍历前面的状态也遍历后面的状态
//上左
for (let i = 0; i < m; ++i) {
for (let j = 0; j < n; ++j) {
if (i - 1 >= 0) {
dp[i][j] = Math.min(dp[i][j], dp[i - 1][j] + 1);
}
if (j - 1 >= 0) {
dp[i][j] = Math.min(dp[i][j], dp[i][j - 1] + 1);
}
}
}
//右下
for (let i = m - 1; i >= 0; --i) {
for (let j = n - 1; j >= 0; --j) {
if (i + 1 < m) {
dp[i][j] = Math.min(dp[i][j], dp[i + 1][j] + 1);
}
if (j + 1 < n) {
dp[i][j] = Math.min(dp[i][j], dp[i][j + 1] + 1);
}
}
}
console.log(dp);
注意事项:遍历的顺序很重要