如何使用不带数组的for循环在c中编写打印特定数字螺旋模式的代码

how to write a code that prints an specific numerical spiral pattern in c using for loops without array

我想编写一段代码,从用户那里获取整数 n 并在不使用数组的情况下以螺旋模式打印从 1 到 n*n 的数字。 output for entering 5

input3
output:
1 2 3
8 9 4
7 6 5

你对如何编写这段代码有什么建议吗?

编辑: 这是使用数组的代码:

#include <stdio.h>

int main(){
/*declaration of the variables*/
int i, j, ascendingNumbers;
int leftAndTop, rightAndBottom;
int size;
scanf("%d", &size);
int matrix[size][size];

leftAndTop = 0;
rightAndBottom = size - 1;
ascendingNumbers = 1;

/*filling the array*/
for(i = 1; i <= size/2; i++, leftAndTop++, rightAndBottom--){
    /*left to right*/
    for(j = leftAndTop; j <= rightAndBottom; j++, ascendingNumbers++){
        matrix[leftAndTop][j] = ascendingNumbers;
    }

    /*top to bottom*/
    for(j = leftAndTop + 1; j <= rightAndBottom; j++, ascendingNumbers++){
        matrix[j][rightAndBottom] = ascendingNumbers;
    }

    /*right to left*/
    for(j = rightAndBottom-1; j >= leftAndTop; j--, ascendingNumbers++){
        matrix[rightAndBottom][j] = ascendingNumbers;
    }

    /*bottom to top*/
    for(j = rightAndBottom - 1; j >= leftAndTop+1; j--, ascendingNumbers++){
        matrix[j][leftAndTop] = ascendingNumbers;
    }
}

/*fill the center for odd size*/
if(size % 2){
    matrix[leftAndTop][j + 1] = ascendingNumbers;
}

/*print*/
for(i = 0; i < size; i++){
    for(j = 0; j < size; j++){
        printf("%d  ", matrix[i][j]);
    }
    printf("\n");
}

return 0;
}

一个解决方案是采用已经可以用螺旋图案填充数组的代码,并将其放入一个嵌套循环中,该循环使用该代码查找当前打印位置的编号。当然有更有效的解决方案,但这允许您将适用于数组的解决方案转换为不需要数组的解决方案。

此处的第一个程序使用数组打印数字的螺旋图案。第二个程序是第一个程序的修改版本,当打印位置与螺旋循环中的位置匹配时打印一个数字,而不是将其存储在数组中。我会留给您看看您是否可以修改现有代码来完成此操作。

使用二维数组:

/* A program that prints a spiral using a 2d array */

#include <stdio.h>

int main(int argc, char *argv[])
{
    int size;
    if (argc < 2 || (sscanf(argv[1], "%d", &size) != 1) || size < 1) {
        fprintf(stderr, "Usage: spiral N  [N > 0]\n");
        return 1;
    }

    int arr[size][size];
    int num_elems = size * size;


    enum Dir { RIGHT, DOWN, LEFT, UP };
    int num_directions = 4;

    int side_len = size;
    int row = 0;       // arr row index
    int col = 0;       // arr column index
    int pos = 0;       // position in a side

    // travel around the spiral to fill the array
    enum Dir direction = RIGHT;
    for (int i = 0; i < num_elems; i++) {
        arr[row][col] = i + 1;
        ++pos;

        if (pos == side_len) {                             // change direction
            direction = (direction + 1) % num_directions;
            pos = 0;

            // having changed direction, shorten side_len in two cases
            if (direction == DOWN || direction == UP) {
                --side_len;
            }
        }

        switch (direction) {
        case RIGHT:
            ++col;
            break;
        case DOWN:
            ++row;
            break;
        case LEFT:
            --col;
            break;
        case UP:
            --row;
            break;
        default:
            fprintf(stderr, "Unexpected value in switch statement\n");
            return 1;
        }
    }

    for (row = 0; row < size; row++) {
        for (col = 0; col < size; col++) {
            printf("%4d", arr[row][col]);
        }
        putchar('\n');
    }
    putchar('\n');

    return 0;
}

仅使用循环:

/* A program that prints a spiral using loops but no arrays */

#include <stdio.h>

int main(int argc, char *argv[])
{
    int size;
    if (argc < 2 || (sscanf(argv[1], "%d", &size) != 1) || size < 0) {
        fprintf(stderr, "Usage: spiral N  [N >= 0]\n");
        return 1;
    }

    int num_elems = size * size;

    enum Dir { RIGHT, DOWN, LEFT, UP };
    int num_directions = 4;

    // loop printing positions: print a row at a time
    for (int y = 0; y < size; y++) {
        for (int x = 0; x < size; x++) {
            int side_len = size;          // length of current side
            int row = 0;                  // arr row index
            int col = 0;                  // arr column index
            int pos = 0;                  // position in a side

            // travel around spiral until printing number is reached
            enum Dir direction = RIGHT;
            for (int i = 0; i < num_elems; i++) {
                if (row == y && col == x) {  // print and escape loop
                    printf("%4d", i + 1);
                    break;
                }
                ++pos;

                if (pos == side_len) {                     // change direction
                    direction = (direction + 1) % num_directions;
                    pos = 0;

                    // having changed direction, shorten side_len in two cases
                    if (direction == DOWN || direction == UP) {
                        --side_len;
                    }
                }

                switch (direction) {
                case RIGHT:
                    ++col;
                    break;
                case DOWN:
                    ++row;
                    break;
                case LEFT:
                    --col;
                    break;
                case UP:
                    --row;
                    break;
                default:
                    fprintf(stderr, "Unexpected value in switch statement\n");
                    return 1;
                }
            }
        }
        // newline after row
        putchar('\n');
    }
    // newline after printing all numbers
    putchar('\n');

    return 0;
}

以下是与第二个程序的几个示例交互:

>$ ./spiral2 3
   1   2   3
   8   9   4
   7   6   5

>$ ./spiral2 6
   1   2   3   4   5   6
  20  21  22  23  24   7
  19  32  33  34  25   8
  18  31  36  35  26   9
  17  30  29  28  27  10
  16  15  14  13  12  11