我有一个矩阵(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");
}
}
答案 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])
。
对于初学者,我想这会帮助你纠正你的程序。