# 0562. Longest Line of Consecutive One in Matrix
###### tags: `Leetcode` `Medium` `Dynamic Programming` `DFS`
Link: https://leetcode.com/problems/longest-line-of-consecutive-one-in-matrix/
## 思路
dfs 也可以用dp做(官方解答)
拿到一个是1的位置我们就会往四个方向遍历
但要注意的是每一个1我们需要判断它是不是当前这个方向的“头”
例如当前方向是```(1,0)``` 如果```(i-1, j)```已经是1了,那说明当前的```(i,j)```已经不是头了,也就是在算```(i-1,j)```开始的序列的时候肯定已经把```(i-1,j)```算进去了 所以我们不需要再计算从```(i,j)```开始方向为```(1,0)```的dfs了
## Code
```java=
class Solution {
public int longestLine(int[][] mat) {
int m = mat.length, n = mat[0].length;
int[][] dp = new int[m][n];
int ans = 0;
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
if(mat[i][j]==0) continue;
if(i==0 || (i!=0 && mat[i-1][j]==0)){
ans = Math.max(ans, dfs(mat, i, j, 1, 0));
}
if(j==0 || (j!=0 && mat[i][j-1]==0)){
ans = Math.max(ans, dfs(mat, i, j, 0, 1));
}
if((i==0 || j==0) ||(i!=0 && j!=0 && mat[i-1][j-1]==0)){
ans = Math.max(ans, dfs(mat, i, j, 1, 1));
}
if((i==0 || j==n-1) || (i!=0 && j!=n-1 && mat[i-1][j+1]==0)){
ans = Math.max(ans, dfs(mat, i, j, 1, -1));
}
}
}
return ans;
}
private int dfs(int[][] mat, int x, int y, int dirx, int diry){
int m = mat.length, n = mat[0].length;
int len = 0;
while(x>=0 && x<m && y>=0 && y<n && mat[x][y]==1){
len++;
x+=dirx;
y+=diry;
}
return len;
}
}
```