首先分为2n-1次循环。每次循环会写入整个斜边的数字。斜边的方向有左下,右上。当循环次数k<=n时,当k为单数时,方向为右上,当k为双数时,方向为左下。当循环次数n<k<2*n-1时,当k为单数时,方向为右上,当k为双数时,方向为左下。

#include <stdio.h>
int main()
    {
        int n;
        scanf("%d",&n);
        int a[n][n];
        int i,k,j;
        int x=1;
        for(k=1;k<=2*n-1;k++)                //总共有7个斜边
           {
            if(k<=n)                        //前4个斜边
            {
                if(k%2==0)                            //如果斜边是双数次
                    {
                    for(i=0,j=k-1;j>=0;i++,j--)            //初始位置是a[0][k-1],由于是向左下移动,j碰壁的时候循环结束
                            a[i][j]=x++;

                    }
                else                                     //如果斜边是单数次
                    {
                        for(i=k-1,j=0;i>=0;j++,i--)    //初始位置是a[k-1][0],由于是向右上移动,i碰壁的时候循环结束
                            a[i][j]=x++;
                    }
            }

        else                             //后三个斜边
            {
                if(k%2==0)
                    {
                        for(i=k-n,j=n-1;i<n;j--,i++)            //初试位置a[k-n][n-1],由于向左下移动,i碰壁的时候停止循环
                            a[i][j]=x++;

                    }
                else 
                       { for(i=n-1,j=k-n;j<n;i--,j++)    //初始位置a[n-1][k-n],由于向右上移动,j碰壁的时候停止循环
                            a[i][j]=x++;}
            }
    }
for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
    }