剑指offer-顺时针打印矩阵
题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
思路:
我们首先定义4个方向,用来表示接下来往哪边走下一步,然后定义一个标记数组用来表示该位置是否走过
方向顺序为右,下,左,上
然后从(0,0)开始遍历,每次我们先以现在的指示方向试探前进,判断下一步能不能走,即判断下一步有没有出界,有没有被走过.
1. 如果下一步能走,那么将该位置加进链表,标记该位走过,(x,y)坐标移动,总数+1
2. 如果下一步不能走,那么修改方向,再执行1的后续步骤
code
public ArrayList<Integer> printMatrix(int [][] matrix) {
int[][] turn={
{0,1},{1,0},{0,-1},{-1,0}
};
if(matrix==null){
return null;
}
ArrayList<Integer> list=new ArrayList<>();
int row=matrix.length;
int col=matrix[0].length;
int cnt=0,sum=0,x=0,y=0;
int[][] vis=new int[row][col];
for(int i=0;i<row;++i) {
for(int j=0;j<col;++j) {
vis[i][j]=0;
}
}
while(sum<row*col) {
int tmpx=x+turn[cnt][0];
int tmpy=y+turn[cnt][1];
if(tmpx<0||tmpx>=row||tmpy<0||tmpy>=col||vis[tmpx][tmpy]!=0) {
cnt=(cnt+1)%4;
}
list.add(matrix[x][y]);
vis[x][y]=1;
x=x+turn[cnt][0];
y=y+turn[cnt][1];
sum++;
}
return list;