题目链接:https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a?tpId=13&&tqId=11172&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

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

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;
    }
}