C语言螺旋方阵程序循环设计

int i,j,k,s,n;
int a[N][N];
printf("请输入方阵类型\n");
scanf("%d",&n);
k=1;s=0;i=0;
while (k<=n*n){
for (j=s;j<n-s;j++){
a[i][j]=k++;
}
j--;
for (i=s+1;i<n-s;i++){
a[i][j]=k++;
}
i--;
for (j=n-s-2;j>=s;j--){
a[i][j]=k++;
}
j++;
for (i=n-s-2;i>=s+1;i--){
a[i][j]=k++;
}
i++;
s++;
}
for (i=0;i<n;i++){
for (j=0;j<n;j++){
printf("%4d",a[i][j]);
}
printf("\n");
}
//请教各位专业人士这个中间的循环能用中文翻译一遍嘛😭

就是从最外层开始生成一个螺旋方阵


#define N 10
int main()
{
    int i, j, k, s, n;
    int a[N][N];
    printf("请输入方阵类型\n");
    scanf("%d", &n); 
    n = 5;//为了给你展示方便,这里n取5
    k = 1; s = 0; i = 0;    //这里s应该代表圈
    while (k <= n * n) {            //整个矩阵填充满后停止
        for (j = s; j < n - s; j++) {   //横坐标不变,纵坐标从s到n-s-1放入k值,比如最外圈(第0圈):从a[0][0]到a[0][4] 为 1 2 3 4 5
            a[i][j] = k++;
        }
        j--;   //j多加了1,所以减回来,比如最外圈(第0圈):此时j = 5 - 1 = 4
        for (i = s + 1; i < n - s; i++) {   //纵坐标不变,横坐标从s+1到n-s-1放入k值,比如最外圈(第0圈):从a[1][4]到a[4][4] 为 6 7 8 9
            a[i][j] = k++;
        }
        i--;    //i多加了1,所以减回来,比如最外圈(第0圈):此时i = 5 - 1 = 4
        for (j = n - s - 2; j >= s; j--) {  //横坐标不变,纵坐标从n-s-2到s放入k值,比如最外圈(第0圈):从a[4][3]到a[4][0] 为 10 11 12 13
            a[i][j] = k++;
        }
        j++;    //j多减了1,所以加回来 ,比如最外圈(第0圈):此时j = -1 + 1 = 0
        for (i = n - s - 2; i >= s + 1; i--) {  //纵坐标不变,横坐标从n-s-2到s+1放入k值,比如最外圈(第0圈):从a[3][0]到a[1][0] 为 14 15 16
            a[i][j] = k++;
        }
        i++;    //i多减了1,所以加回来   ,比如最外圈(第0圈):此时i = 0 + 1 = 1
        s++;    //下一圈
    }
    for (i = 0; i < n; i++) {       //打印整个方阵
        for (j = 0; j < n; j++) {
            printf("%4d", a[i][j]);
        }
        printf("\n");
    }

}

img

Do not let me think.

#include <stdio.h>
#define MAXN 100
int m[MAXN+2][MAXN+2];
char d;
int x,y,k,n,w;
char str[10];
void main() {
    while (1) {
        printf("Input n(1..%d):",MAXN);
        fflush(stdout);
        rewind(stdin);
        if (1==scanf("%d",&n)) {
            if (1<=n && n<=MAXN) break;
        }
    }
    y=0  ;for (x=0;x<=n+1;x++) m[y][x]=1;
    y=n+1;for (x=0;x<=n+1;x++) m[y][x]=1;
    x=0  ;for (y=0;y<=n+1;y++) m[y][x]=1;
    x=n+1;for (y=0;y<=n+1;y++) m[y][x]=1;
    for (y=1;y<=n;y++) {
        for (x=1;x<=n;x++) {
            m[y][x]=0;
        }
    }
    x=1;
    y=1;
    k=0;
    d='D';
    while (1) {
        k++;
        if (k>n*n) break;
        m[y][x]=k;
        switch (d) {
            case 'D':
                if (0==m[y+1][x])  y++;
                else              {x++;d='R';}
            break;
            case 'R':
                if (0==m[y][x+1])  x++;
                else              {y--;d='U';}
            break;
            case 'U':
                if (0==m[y-1][x])  y--;
                else              {x--;d='L';}
            break;
            case 'L':
                if (0==m[y][x-1])  x--;
                else              {y++;d='D';}
            break;
        }
    }
    w=sprintf(str,"%d",n*n);
    for (y=1;y<=n;y++) {
        for (x=1;x<=n;x++) {
            printf(" %0*d",w,m[y][x]);
        }
        printf("\n");
    }
}