将矩阵转45°后进行存储和遍历输出,边界条件更好判断

alt

#include <iostream>

using namespace std;

const int N = 1010;
int out[2*N][2*N];
int n;

int main() {
	cin >> n;

	int st = 1;
	for (int i = 1; i <= 2 * n - 1; i++) {
		if (i <= n) {
			if (i % 2 != 0)
				for (int j = 1; j <= i; j++)
					out[i][j] = st++;
			else
				for (int j = i; j >= 1; j--)
					out[i][j] = st++;
		}
		else {
			if (i % 2 != 0)
				for (int j = 1; j <= n - i % n; j++)
					out[i][j] = st++;
			else
				for (int j = n - i % n; j >= 1; j--)
					out[i][j] = st++;
		}
	}

	for (int i = 1; i <= n; i++) {
		int x = i, y = 1;
		for (int j = 0; j < n; j++) {
			cout << out[x][y] << " ";
			if (x < n) {
				x++;
				y++;
			}
			else {
				x++;
			}
		}
		cout << endl;
	}
}