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

时间:2018-11-15 18:11:21

标签: c for-loop while-loop spiral

我想编写一个从用户那里获取整数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;
}

1 个答案:

答案 0 :(得分:1)

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

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

使用二维数组:

/* 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