在c中以螺旋顺序填充2d数组

时间:2017-04-27 16:52:55

标签: c arrays

我在做程序,我从键盘输入数字。然后创建2d数组,并以螺旋顺序填充直到此数字。数字后的所有元素将等于0;该函数以螺旋顺序填充数组(右 - >向下 - >向左 - >向上>。

代码是:

#include <stdio.h>
#include <time.h>

void spiral(int array[100][100], int m, int n, int s)
{
int size, b, x = 0, y = 1, num = 1;
 size = m*n;
for (num=1;num<=size+1;num++)
{  
    for (b = x; b < n; b++)
    {
        if (num <=s) {
            array[x][b] = num;
            num++;
        }
        else array[x][b] = 0;
    }

    if (num == size + 1)
    {
        break;
    }

    for (b = y; b < m; b++)
    {
        if (num <=s) {
            array[b][n - 1] = num;
            num++;
        }
        else array[b][n - 1] = 0;
    }

    if (num == size + 1)
    {
        break;
    }

    y++;
    n--;

    for (b = n - 1; b > x; b--)
    {
        if (num <= s) {
            array[m - 1][b] = num;
            num++;
        }
        else array[m - 1][b] = 0;
    }

    if (num == size + 1)
    {
        break;
    }

    for (b = m - 1; b > x; b--)
    {
        if (num <= s) {
            array[b][x] = num;
            num++;
        }
        else array[b][x] = 0;
    }
    x++;
    m--;
}
}

int main()
    {   
  int m, n, s, array[100][100];
  srand(time(NULL));
  //m=3;
  // n=4;
  m = 2 + rand() % 5;
  n = 2 + rand() % 5;
  //memset(array, 0, sizeof(array[0][0]) * 10 * 10);
  printf("enter the number \n");
  scanf("%i", &s);
  spiral(array, m, n, s);

 for (int i = 0; i < m; i++)
{                                                                          
 for (int j = 0; j < n; j++)
{
    printf("%i\t", array[i][j]);
}
   printf("\n");
}

return (0); }

但它始终无法正常工作。

例如,当我输入15并且程序生成4 * 3数组时,输出为`

   1       2       3
   10      12      4
   9       -858993460      5
   8       7       6`

但预期输出为 1 2 3 10 11 4 9 12 5 8 7 6

或者当我输入15并且程序生成4 * 5数组时,输出为 1 2 3 4 5 14 0 0 0 6 13 0 0 0 7 12 11 10 9 8

预期输出为 1 2 3 4 5 14 15 0 0 6 13 0 0 0 7 12 11 10 9 8

我找不到这段代码的错误。

1 个答案:

答案 0 :(得分:2)

试试这个:

void printArray(int array[10][10], int m, int n) {

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            printf("%i\t", array[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

void spiral(int array[10][10], int m, int n, int s)
{
    int size, b, x = 0, y = 1, num = 1;
    size = m*n;
    while ( num <= s )
    {

        for (b = x; b < n; b++)
        {
            if (num <= s) {
                array[x][b] = num;
                num++;
            } else array[x][b] = 0;
        }

        if (num == size + 1)
        {
            break;
        }

        for (b = y; b < m; b++)
        {
            if (num <= s) {
                array[b][n - 1] = num;
                num++;
            } else array[b][n - 1] = 0;
        }

        if (num == size + 1)
        {
            break;
        }

        y++;
        n--;

        for (b = n - 1; b > x; b--)
        {
            if (num <= s) {
                array[m - 1][b] = num;
                num++;
            } else array[m - 1][b] = 0;
        }

        if (num == size + 1)
        {
            break;
        }


        for (b = m - 1; b > x; b--)
        {
            if (num <= s) {
                array[b][x] = num;
                num++;
            } else array[b][x] = 0;
        }
        x++; 
        m--;
    }
}



int main()
{
    int m, n, s, array[10][10];
    srand(time(NULL));
    m = 2 + rand() % 5;
    n = 2 + rand() % 5;
    memset(array, 0, sizeof(array[0][0]) * 10* 10);
    printf("enter the number \n");
    scanf("%i", &s);
    spiral(array, m, n, s);

    printArray(array, m, n);


    return (0);
}

在螺旋函数顶部有一些奇怪的循环之前。其中的num ++干扰了这样一个事实,即你已经将num增加了一个并使它在下一次写入最上面一行时跳过该数字。 我把它改成了一个运行到num>s的while循环,它现在似乎对我有效。

请注意,我刚刚添加了printArray以便于调试。