思路:按照题意模拟,首先我们向右走,先判断向右走一个是否会越界和右边的点是否是我们走过的点,如果不会越界则我们就向右走,然后把我们已经走过的这个点进行标记。如果下一步不能在进行移动,此时我们就需要换方向向下走,同理,如果下一个点不能走了,我们就往左走和往上走,如果某一个方向上下一个点可以到达,我们就对当前点进行标记,然后走向下一个点。当最后我们站在某一个点上发现四个方向都不能走的时候,此时我们当前点就是最后一个点,我们跳出循环即可。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
int n = matrix.length, m = matrix[0].length;
boolean[][] vis = new boolean[n][m];
for(int i = 0; i < n; ++ i) {
for(int j = 0; j < m; ++ j) vis[i][j] = false;
}
ArrayList<Integer> list = new ArrayList<>();
int x = 0, y = 0, ans = 0;
while(!vis[x][y]) {
while(y + 1 < m && !vis[x][y + 1]) {
list.add(matrix[x][y]);
vis[x][y] = true;
++ y; ++ ans;
}
while(x + 1 < n && !vis[x + 1][y]) {
list.add(matrix[x][y]);
vis[x][y] = true;
++ x; ++ ans;
}
while(y - 1 >= 0 && !vis[x][y - 1]) {
list.add(matrix[x][y]);
vis[x][y] = true;
-- y; ++ ans;
}
while(x - 1 >= 0 && !vis[x - 1][y]) {
list.add(matrix[x][y]);
vis[x][y] = true;
-- x; ++ ans;
}
if(ans == n * m - 1) break;
}
list.add(matrix[x][y]);
return list;
}
} 
京公网安备 11010502036488号