寻找规律,迎刃而解
可以发现每一斜行的数字个数是由1递增至n再递减至1的,写每一斜行的数字递增方向都是固定的。
需要注意:1.对角线的左右两侧切换斜行时坐标变化不同
2.n为奇数和偶数时要做细节的处理
#include <cstring> #include <iostream> using namespace std; int main() { int n; cin >> n; int arr[1010][1010]; memset(arr, 0, sizeof arr); int x = 2, y = 0; int dir_x = -1, dir_y = 1; int cnt = 0; //对角线左上侧 for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { x += dir_x; y += dir_y; arr[x][y] = ++cnt; } if (dir_x == 1) { x += 2; y -= 1; } else { x -= 1; y += 2; } dir_x = -dir_x; dir_y = -dir_y; } //对角线右下侧 //先做一个预处理 if (n % 2 == 0) { x -= 1; y += 1; } else { x += 1; y -= 1; } for (int i = n - 1; i >= 1; i--) { for (int j = 1; j <= i; j++) { x += dir_x; y += dir_y; arr[x][y] = ++cnt; } if (dir_x == 1) { x += 1; } else { y += 1; } dir_x = -dir_x; dir_y = -dir_y; } for (int i = 1; i <= n; i++) { for (int j = 1; j < n; j++) cout << arr[i][j] << " "; cout << arr[i][n] << endl; } }