import java.util.Scanner;
public class A018_顺时针打印二维数组 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = 8;
int m = 5;
int[][] a = new int[n][m];
boolean[][] book = new boolean[n][m];
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
a[i][j] = sc.nextInt();
int startX = 0, startY = 0, endX = n - 1, endY = m - 1;
while (startX <= endX && startY <= endY) {
int x = startX, y = startY;
while (y <= endY && !book[x][y]){
book[x][y] = true;
System.out.print(a[x][y++] + " ");
}
y = endY;
x++;
while (x <= endX && !book[x][y]){
book[x][y] = true;
System.out.print(a[x++][y] + " ");
}
x = endX;
y--;
while (y >= startY && !book[x][y]){
book[x][y] = true;
System.out.print(a[x][y--] + " ");
}
y = startY;
x--;
while (x > startX && !book[x][y]){
book[x][y] = true;
System.out.print(a[x--][y] + " ");
}
x = startX;
y++;
System.out.println();
// 上面一行走完后
startX++;
// 右边一列走完后
endY--;
// 下面一行走完后
endX--;
// 左边一列走完后
startY++;
}
}
}
这里用book记录输出过的点,然后用6个变量,分别记录初值,和变化的量
初值就是数组的顶点的x和y,还有数组末位的x和y,也就是代码中的start和end
然后再用x和y作为变化的值,并且从初值0,0开始
按照顺序打印上面那行,每遍历一个点,就把book的值变为true,然后因为遍历后的y值是大于endY值的,所以要把y的值再重新赋为endY;
因为最上面那行已经打印过了,所以要把x++,打印右面那一列除了第一行已经打印过的其他元素;
那么同理,在打印完这一列后,也要把x的值重新赋为endX,然后再把y–,意思是,这一列打印完了,接下来打印最下面左边那行了,以此类推;
当最外面一圈打印完后,这里也就来到了外层循环的末尾,就需要把初值进行变化,也就是起始的两个start++然后把末尾的两个end–。