293. 隧道的深度
当一个二进制矩阵除了从左上角到右上角的一条路径上值为1,其他值均为0时,我们称这个矩阵有一条隧道。除了起点和终点只有一个相邻的”1“,在这条路径上的每一个“1"都恰好有两个相邻的”1“。
现在给你一个有隧道的矩阵,请回答这条隧道的深度(这条隧道能到达的最后一行的序号,从0开始计数)
样例
样例
输入: [[1,0,0,0,1],[1,1,0,0,1],[0,1,0,1,1],[0,1,1,1,0],[0,0,0,0,0]]
输出:3
注意事项
矩阵中数的个数不超过1e7.
public class Solution {
/**
* @param matrix: the matrix in problem
* @return: the depth of the tunnel.
*/
public int FindDepth(int[][] matrix) {
// 从左上角开始沿着隧道移动,
// 每到达一个位置就比较该位置的行号是不是比答案更大,
// 并且把该位置置为0,表示不能再移动到该位置
int m = matrix.length, n = matrix[0].length;
int i = 0, j = 0;
int ans = 0;
int[][] dir = {
{0,1},{0,-1},{1,0},{-1,0}
};
matrix[i][j] = 0;
// 每次都会向当前位置的相邻四个位置移动一次,
// 没有移动时说明到达右上角,根据题目,一定会到右上角
while (true) {
ans = Math.max(ans, i);
int ni = -1, nj = -1;
boolean find = false; // 标识有没有可移动位置
for (int k=0;k<4;k++) {
ni = i+dir[k][0]; nj = j+dir[k][1];
if (ni>=0&&ni<m&&nj>=0&&nj<n&&matrix[ni][nj]==1) {
find = true;
i = ni; j = nj;
matrix[ni][nj] = 0;
break;
}
}
if (!find) break; // 没找到可移动位置,退出
}
return ans;
}
}