寻找规律,迎刃而解


可以发现每一斜行的数字个数是由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;
    }
}