01矩陣一個充滿着坑的dp問題,今天我們用dfs來解決這個問題
1.首先遍歷數組當1的左上右下四個方向沒有0時我們給它初始化一個較大的值數組的行數加列數這樣做是爲了保證在我們尋路時確保此位通過+1不能遇見0
2.我們開始遍歷這個二維數組當matrix[i][j]==1時開始遞歸邏輯
3.我們定義一個direction數組這個數組定義左上右下四個方向的移動座標
4.在遞歸函數裏開始循環direction newX=x+direction[k][0] newY=y+direction[k][1],當座標合法並且此座標的值大於等於x,y座標的值+1那麼替換newX,newY座標的值,然後繼續遞歸,這個比較就彰顯了我們將1一步不能到0初始化爲較大值的作用,這樣的替換保證了找到的路徑最小
舉個例子:
如當前數組
0到0的距離爲0不用管
當遇到第一個1時周圍有0直接遞歸函數(不滿足matrix[newX][newY]>matrix[x][y]+1)結束,不用遞歸當前位仍是1
當遇到第二個1同上
當遇到第四個1同上
第三個值不爲1當遇到的時候此值>1+1 =2將此值替換爲2
結果如下
上代碼:
class Solution {
private int[][] direction={{0,-1},{-1,0},{0,1},{1,0}};
public int[][] updateMatrix(int[][] matrix) {
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[i].length;j++){
if(matrix[i][j]==1&&!oneStep(matrix,i,j)){
matrix[i][j]=matrix.length+matrix[i].length;
}
}
}
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[i].length;j++){
if(matrix[i][j]==1){
dfs(matrix,i,j);
}
}
}
return matrix;
}
public void dfs(int[][] matrix,int x,int y){
for(int i=0;i<4;i++){
int newX=x+direction[i][0];
int newY=y+direction[i][1];
if(isArea(matrix,newX,newY)&&matrix[x][y]+1<matrix[newX][newY]){
matrix[newX][newY]=matrix[x][y]+1;
dfs(matrix,newX,newY);
}
}
}
public boolean oneStep(int[][] matrix,int x,int y){
for(int k=0;k<4;k++){
int newX=x+direction[k][0];
int newY=y+direction[k][1];
if(isArea(matrix,newX,newY)&&matrix[newX][newY]==0){
return true;
}
}
return false;
}
public boolean isArea(int[][] matrix,int x,int y){
return x>=0&&y>=0&&x<matrix.length&&y<matrix[x].length;
}
}