把“右上 $\longrightarrow$(右或下)$\longrightarrow$ 左下 $\longrightarrow$(下或右)”看成一个组合进行循环模拟
且只有在“左下”或“右上”时,才打印(记录)数字
import java.util.*;
import java.lang.*;
public class Main {
static Scanner scanner = new Scanner(System.in);
static int n, N = 510;
static int[][] f = new int[N][N];
public static void main(String[] args) {
n = scanner.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) f[i][j] = scanner.nextInt();
}
StringBuilder sb = new StringBuilder(); // System.out.print太慢 换sb 10s --> 4s
// 把“右上 -> (右或下) -> 左下 -> (下或右)”看成一个组合 初始是往右上的(虽然只有一格)
int x = 1, y = 1, i, j;
while (x <= n && y <= n) {
// 往右上遍历 直到越界
for (i = x, j = y; i >= 1 && j <= n; i -= 1, j += 1) sb.append(f[i][j]).append(" ");
// 更新xy为未越界的最后一对坐标
x = i + 1;
y = j - 1;
// 能往右就往右 不能就往下
if (y + 1 <= n) y++;
else x++;
// 往左下遍历 直到越界
for (i = x, j = y; i <= n && j >= 1; i += 1, j -= 1) sb.append(f[i][j]).append(" ");
// 更新xy为未越界的最后一对坐标
x = i - 1;
y = j + 1;
// 能往下就往下 不能就往右
if (x + 1 <= n) x++;
else y++;
}
System.out.println(sb);
}
}