【问题标题】:Fill an Array in C in a spiral way以螺旋方式填充C中的数组
【发布时间】:2015-06-06 20:01:55
【问题描述】:

好的,我必须做一个像这样以螺旋方式填充数组的程序

1  2  5  10 
4  3  6  11 
9  8  7  12 
16 15 14 13 

它不像从中心开始的正常螺旋,所以我遇到了一些麻烦。存储数据的位置应该像

array[0] [0] 
array[0] [1] 
array[1] [1] 
array[1] [0] 


array[0] [2] 
array[1] [2] 
array[2] [2]
array[2] [1] 
array[2] [0] 

array[0] [3] 
array[1] [3] 
array[2] [3]
array[3] [3] 
array[3] [2] 
array[3] [1]
array[3] [0] 

等等,但我想不出一个合适的循环来帮助我填满它,所以我不得不向你们寻求帮助

【问题讨论】:

  • 你的程序输出什么?请显示代码,以及您认为哪里出错了。
  • 你需要遍历它的右边缘和下边缘,首先是一个 1x1 的正方形,然后是一个 2x2 的正方形,依此类推,维护一个带有当前数字的变量来插入。
  • 您已经通过写下索引序列完成了第一步。这绝对可以帮助您确定序列遵循的规则。你也已经把它分成了块,这很好。但是,您的第一个块应该分成单行 (array[0] [0]) 作为第一块,其余 3 行 (array[0][1], array[1][1], array[ 1][0]) 作为第二个块。那么你应该已经看到了块之间和块内的结构。
  • 将你的第一步分成两步,第一步是[0][0],你应该会看到一个清晰的模式。

标签: c arrays spiral


【解决方案1】:

您好,我希望以下代码对您有用。我保留了printf 声明以显示它是否存储了正确的值。

#include<stdio.h>
#define MAT_DIM 4

int main()
{
    int loop1,loop2;
    int number = 0;
    int array[MAT_DIM][MAT_DIM];    
    for(loop1 = 0; loop1 < MAT_DIM; loop1++)
    {
        for(loop2 = 0; loop2 <= loop1; loop2++) 
        {
            array[loop2][loop1] = ++number;                 
            printf("%d  %d  %d \n", loop2, loop1, array[loop2][loop1]); 
        }


        for(loop2 = loop1-1; loop2 >= 0; loop2--) 
        {
            array[loop1][loop2] = ++number;
            printf("%d  %d  %d \n", loop1, loop2, array[loop1][loop2]);
        }
    }           
    return 0;
}

编辑

代码如下: 我们需要三个loops

  1. 增加矩阵的维数(外增量循环)
  2. 一旦尺寸固定,第二个循环将有助于进入下一列。 (内部增量循环)
  3. 需要第三次循环才能返回第一行。 (内部递减循环)

对于第一次交互: 我们正在存储 1*1 维度的数组。这里内部递减循环不起作用

对于第二次交互: loop1 变为 1 所以第二列将被下一个值填充,直到它到达第二行。 这里将出现第二个内循环。此循环将从当前行开始存储值并递减 loop2 值。一旦它达到零,它就会破裂。

所以我们先存储列,循环递增,然后存储行,循环递减。同样将继续,直到外循环达到循环中的尺寸。这里它将上升到 4 作为矩阵的维度。

【讨论】:

  • 请解释一下概念,而不是只为那家伙写代码。
【解决方案2】:

你只是在做一个反向 L 。所以你需要先做一列然后再做一行。 看代码

`

int k=1;
//n= no of rows/cols
array[0][0]=1;
for(i=0;i<n;i++)
{
    for(j=0;j<=i;j++) //column
    array[j][i]=k++;

    for(j=i-1;j>=0;j--)  //row
    array[i][j]=k++;
}

`

【讨论】:

  • 公然提供代码对他没有帮助。试着解释如何去做,然后让他去做。 :)
  • @WeatherVane 看到我告诉他需要做一个反向 L 因此填充一列然后填充一行,如果解释和提供代码不好,我很抱歉。下次我会只发布解释而不是代码,但到时候人们会称赞发布代码的人。
  • @cruxioneffux:在其他情况下,这可能是正确的选择。请“感知”问题的类型。这很可能是家庭作业。向他提出解决方案只会阻止他进一步思考。它不包含任何他自己想不到的东西(新技巧或 API 调用)。所以他什么都没学到。在其他情况下,它不是关于机械地编写代码,而是关于技术/技巧或最佳实践,使用代码来说明它可能会很好。无论如何,代码多于解释从来都不是好事。另请阅读:meta.stackexchange.com/a/10812
  • @WeatherVane:好的,我会尽力提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
相关资源
最近更新 更多