题目描述:
解题思路:
这道题依然是dfs,区别是,不是上下左右的一直找了,而是一条直线走到头,细节方面一开始还是没处理好,好在最后AC了。
就是简单的四个方向的dfs分开进行判断即可,可能写的有点啰嗦了,但是很容易看懂的。
AC代码:
public int numSpecial(int[][] mat) {
int sum = 0;
for (int i = 0; i < mat.length; i++) {
for (int j = 0; j < mat[0].length; j++) {
if (mat[i][j] == 1) {
if (dfsleft(mat, i - 1, j) && dfsright(mat, i + 1, j) && dfsup(mat, i, j + 1) && dfsdown(mat, i, j - 1))
sum++;
}
}
}
return sum;
}
boolean dfsup(int[][] mat, int x, int y) {
if (x >= mat.length || x < 0 || y >= mat[0].length || y < 0)
return true;
if (mat[x][y] == 1) {
return false;
}
return dfsup(mat, x, y + 1);
}
boolean dfsdown(int[][] mat, int x, int y) {
if (x >= mat.length || x < 0 || y >= mat[0].length || y < 0)
return true;
if (mat[x][y] == 1) {
return false;
}
return dfsdown(mat, x, y - 1);
}
boolean dfsleft(int[][] mat, int x, int y) {
if (x >= mat.length || x < 0 || y >= mat[0].length || y < 0)
return true;
if (mat[x][y] == 1) {
return false;
}
return dfsleft(mat, x - 1, y);
}
boolean dfsright(int[][] mat, int x, int y) {
if (x >= mat.length || x < 0 || y >= mat[0].length || y < 0)
return true;
if (mat[x][y] == 1) {
return false;
}
return dfsright(mat, x + 1, y);
}