螺旋矩阵(作为2d指针)

时间:2016-02-11 13:01:49

标签: c pointers malloc spiral

我有一个矩阵(2d指针,(** a)),我想扫描螺旋状的元素。(第一个然后是最后一列,最后一行(反向),第一列,第二行,依此类推。 例如:

1 2 3
8 9 4
7 6 5

我在C中有以下代码,但我知道在“其他”情况下我错了。

#include <stdio.h>
#include <malloc.h>

int main(void)
{
int i, j, n, m, p, q, **a, s, c = 0;
printf("rows\n");
scanf("%d", &m);
printf("cols\n");
scanf("%d", &n);
a = (int**)malloc(m*sizeof(int));
for (i = 0; i < m; i++)
{
    a[i] = (int*)malloc(n*sizeof(int));
}
printf("insert\n");
for (i = 0; i < m; i++)
{
    if (i % 2 == 0)
    {
        for (j = 0; j < n; j++)
        {
            printf("a[%d][%d]=", i + 1, j + 1);
            scanf("%d", &a[i][j]);
        }
    }
    else
    {
        for (j = i+1; j < m-i;j++)
        {
            scanf("%d", a[j][m-c]);
        }
        c++;
    }
}


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

1 个答案:

答案 0 :(得分:1)

可能的方法是使用变量direction,可以是东,南,西,北。用0-3表示它们,现在我们继续。

另外,我们使用两个辅助数组

int xDir = [0, 1, 0, -1];
int yDir = [1, 0, -1, 0];

direction = 0开始。每次完成某个方向的遍历时,您都会设置direction = (direction + 1) % 4

我们还将使用另一个变量length,它将表示我应该走多远的某个方向。最初是length = row size of your matrix

长度的值将类似于row, col - 1, row - 1, col - 2, row - 2, col - 3...,此模式将继续。

完成遍历第一行后,将direction设置为1,并将长度更新为上述模式的下一个值。你怎么知道你已经完成了?长度步骤完成后。

当长度值为0时,您就会停止。

您如何采取下一步措施?

如果您当前的排名是(x,y),那么您的下一个排名将是(x + xDir[direction], y + yDir[direction])

对于初学者,我想这会帮助你纠正你的程序。