c - 螺旋矩阵(作为二维指针)

标签 c pointers malloc spiral

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

1 2 3
8 9 4
7 6 5

我有以下 C 代码,但我知道在“else”条件下我错了。

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

最佳答案

一种可能的方法是使用变量 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]) .

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

关于c - 螺旋矩阵(作为二维指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35340079/

相关文章:

c - 在函数内动态分配结构体数组

c++ - 我怎样才能在 vector 中有一对引用?

c - 重新分配后如何更改保存的地址

c - 在 C 中规范化二维数组时值不正确

objective-c - C/Objective-C 中 Malloc 16 字节的泄漏

c - Visual Studio Community 2015 和 C 语言调试

c++ - C中自增/自减运算符的必要性

c - 在 C 中类型转换变量的性能开销

c - 我们如何使用指向数组的指针访问二维数组的内容

c - 按数字对 2D 字符数组进行排序