思路:按照题意模拟,首先我们向右走,先判断向右走一个是否会越界和右边的点是否是我们走过的点,如果不会越界则我们就向右走,然后把我们已经走过的这个点进行标记。如果下一步不能在进行移动,此时我们就需要换方向向下走,同理,如果下一个点不能走了,我们就往左走和往上走,如果某一个方向上下一个点可以到达,我们就对当前点进行标记,然后走向下一个点。当最后我们站在某一个点上发现四个方向都不能走的时候,此时我们当前点就是最后一个点,我们跳出循环即可。
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; } }