思路:

1.数组这样创建

因为数组的下标是从0开始,为了方便我便创建一个array[n+1][n+1]大的二维数组,这样我就可以不用管索引0,直接从坐标(1,1)开始.
n的范围是[1,1000],所以创建二维数组array[1001][1001] (我不知道编译器是否支持变长数组,所以就保险起见把所有范围都开了)

2.明确蛇形的构造

我画一个图来方便大家观看.
图片说明
我们可以看见,移动的方向只有两个:

  • 右上
  • 左下

3.逻辑的推理

所以,我用pos变量表示方向,其中1代表右上与右,-1代表左下与下.
i代表-------------j代表
运动情况分为6种:

  1. 碰到上边界(即i等于1 且 j小于n): 列增加1,行不变--------往右移动一格
  2. 碰到左边界(即j等于1 且 i小于n): 行增加1,列不变--------往下移动一格
  3. 碰到右边界(即j等于n): 行增加1,列不变--------往下移动一格
  4. 碰到下边界(即i等于n): 列增加1,行不变--------往右移动一格

以上四种是在边界上面移动.只有向右 和 向下

  1. 除去上面四种的边界情况,就是在边界中间的左下移动
  2. 除去上面四种的边界情况,就是在边界中间的右上移动

最后两种是在边界内移动 只有右上和左下

4.代码开始上传

首先默认(1,1)位置已经有1了,上代码:

#include <stdio.h>
int array[1001][1001] = { 0 };
int main(void)
{
    int n = 0;
    scanf("%d",&n);
    int i = 1, j = 1, k = 0,pos = 1; //pos代表方向移动   1代表右上   -1代表左下
    array[i][j] = 1;
    for (k = 2; k <= n*n; k++)
    {
        if (i == 1 && j <n && pos ==1) //碰到上边界,列增加1,行不变     此后行增,列减
        {
            array[i][++j] = k;
            pos = -1;                 //方向注意
        }
        else if(j==1 && i<n && pos == -1)//碰到左边界,行增加1,列不变     此后行减,列增
        {
            array[++i][j] = k;
            pos = 1;                     //方向注意                
        }
        else if (j == n && pos==1) //碰到左边界,行增加1,列不变     此后行增,列减
        {
            array[++i][j] = k;
            pos = -1;                     //方向注意
        }
        else if (i == n && pos ==-1) //碰到右边界,列增加1,行不变    此后行减,列增
        {
            array[i][++j] = k;
            pos = 1;
        }
        else if (pos == 1)         //除去上面的边界情况,就是中间移动过程
        {
            array[--i][++j] = k;
        }
        else if(pos == -1)
        {
            array[++i][--j] = k;
        }
    }
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++)
            printf("%d ",array[i][j]);
        printf("\n");
    }
    return 0;
}