簡體   English   中英

在c中以螺旋順序填充二維數組

[英]Fill 2d array in spiral order in c

我正在做我從鍵盤輸入數字的程序。 然后創建二維數組,並按螺旋順序填充直到這個數字。 數字之后的所有元素都將等於 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

我找不到這段代碼有什么問題。

試試這個:

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);
}

在你的螺旋函數之上有一些奇怪的 for 循環之前。 其中的 num++ 干擾了這樣一個事實,即您已經將 num 增加了一個,並使其在下次寫入最上面的行時跳過該數字。 我將其更改為一個運行到num>s的 while 循環,它現在似乎對我有用。

請注意,我只是添加了 printArray 以便於調試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM