本题直接用程序模拟规律即可

规律如下:
行坐标i,列坐标j (均从1开始)
下标和为偶数

  • 向右上方平移,即i+1,j-1

    • 如果上越界,需要向右平移j+1
      • 如果右越界,需要向下平移i+1
    • 可以看成只要右越界,就一定向下(i+1),所以判断右越界先于判断上越界
      下标和为奇数
  • 向左下方平移,即j-1,i+1

    • 同上述分析,只要下越界,必然向右平移,即j+1,i不变

    • 没有下越界,只有左越界,向下平移,j不变,i+1
      这样就模拟出坐标的运动。
      只需要设出初始位置(1,1),其值为1,下面循环 直到加的数字n==规格的平方即可。
      代码如下:

      #include<bits/stdc++.h>
      using namespace std;
      int main() {
      int q = 0;//规格
      scanf("%d",&q);
      int a[1001][1001]={0};
      // freopen("data.txt", "r", stdin);
      int n=1;//每次填入的数字
      a[1][1]=1;
      int i=1;int j=1;//行列坐标
      while(n!=q*q){
        if ((i+j)%2==0){
            if (j+1>q||j+1<=0){//右越界(先判断)
                i = i+1;
            }
            else if (i-1<=0||i-1>q){//上越界
                j = j+1;
            }
            else{//没越界
                j = j+1;
                i = i-1;
            }
        }
        else{
            if (i+1>q||i+1<=0){//下越界(先判断)
                j = j+1;
            }
            else if (j-1<=0||j-1>q){
                i = i+1;//左越界
            }
            else{
                j = j-1;
                i = i+1;
            }
        }
        n++;
        a[i][j]=n;
      }
      //显示即可
      for(int i=1;i<=q;i++){
        for(int j=1;j<=q;j++){
            if (j!=q)
            printf("%d ",a[i][j]);
            else if (j==q)
                printf("%d\n",a[i][j]);
        }
      }
      
      return 0;
      }