用两个数字螺旋填充矩阵

Fill matrix with two numbers in a spiral

矩阵中间是数字x。矩阵以螺旋方式填充x,其余填充y。

示例:

int x=4, y=6, v=7, s=9;

输出:

6 6 6 6 6 6 6 6 4
4 4 4 4 4 4 4 6 4
4 6 6 6 6 6 4 6 4
4 6 4 4 x 6 4 6 4
4 6 4 6 6 6 4 6 4
4 6 4 4 4 4 4 6 4
4 6 6 6 6 6 6 6 4

螺旋填充看起来像 --> this

#include <stdio.h>
int main() {
  int v = 7, s = 9, x = 4, y = 6, mat[7][9], i, j, l, k;
  for (i = 0; i < v; i++)
    for (j = 0; j < s; j++)
      mat[i][j] = y;
  for (i = 0; i < v; i++) {
    for (j = 0; j < s; j++) {
      // spiral goes here
      // mat[i][j] = x;
    }
  }
  for (i = 0; i < v; i++) {
    for (j = 0; j < s; j++) 
      printf("%4d", mat[i][j]);
    printf("\n");
  }
  return 0;
}

编辑:应用建议后,现在整个矩阵都充满了 y。怎么用x填充螺旋线?

在内循环的第一次迭代中,if (i == v / 2 && j == s / 2) 始终为 false,因此您继续这样做:

        mat[l][k--] = x;  // Decrement k
        mat[l++][j] = y;  // Increment l

现在添加 inner-loop:

                        ------ Increment k
                        |

    for (k = j; k < s; k++) {
      //if (i == v / 2 && j == s / 2)  // Always false when i is zero
      //  mat[i][j] = x;
      //else 
      {
        mat[l][k--] = x;  // Decrement k
        mat[l++][j] = y;  // Increment l
      }
    }

因此,您在 for 循环中递减 k 并递增 k。换句话说 - k 没有改变,你有一个无限循环。在那个无限循环中,您不断递增 l 并将其用作数组索引。这将越界访问数组并使您的程序崩溃。

下面是一个在 s x v 矩阵中从中心构造螺旋的程序。

算法如下:

  1. 矩阵用y值填充
  2. 计算中心,游标cx,cy设在那里,写0
  3. 设置螺旋绘制方向,dir,1-left,2-down,3-right,4-up,first 1
  4. 通过将 x 值设置为矩阵绘制 1 步
  5. 如果 dir+1 的矩阵中的值(如果 dir+1=5,则 dir=1)= y(空),则 dir 递增 +1。如果不是(中心 (0) 或已绘制 (x)),则 dir 保持不变。 如果超出矩阵的边缘,则 dir 递增 +1,就好像是空的,但什么也没有绘制。
  6. 步骤 4 重复 s*v/2 次

程序是用gcc编译器编译的。

输出:

cx - 4, xy - 3
6 6 6 6 6 6 6 6 4
4 4 4 4 4 4 4 6 4
4 6 6 6 6 6 4 6 4
4 6 4 4 0 6 4 6 4
4 6 4 6 6 6 4 6 4
4 6 4 4 4 4 4 6 4
4 6 6 6 6 6 6 6 4

必填:

6 6 6 6 6 6 6 6 4
4 4 4 4 4 4 4 6 4
4 6 6 6 6 6 4 6 4
4 6 4 4 x 6 4 6 4
4 6 4 6 6 6 4 6 4
4 6 4 4 4 4 4 6 4
4 6 6 6 6 6 6 6 4

#include <stdio.h>


/*
 Increase dir
*/
int incdir (int dir) {

    // direction, 1 - left, 2 - down, 3 - right, 4 - up
    dir++;
    if (dir==5) dir=1;
    return dir;
    
}


/*
 Is coord in matrix
*/
int inmat (int y, int x, int v, int s) {

    // direction, 1 - left, 2 - down, 3 - right, 4 - up
    if (x<0 || x>=s) return 0;
    if (y<0 || y>=v) return 0;
    return 1;

}


/*
 Value in some direction
*/
int dirval(int cx, int cy, int v, int s, int dir, int mat[v][s]) {

    // direction, 1 - left, 2 - down, 3 - right, 4 - up
    
    if (dir==1) {
        if (!inmat(cy, cx-2, v, s)) return -1;
        return mat[cy][cx-2];
        
    }
    if (dir==2) {
        if (!inmat(cy+2, cx, v, s)) return -1;
        return mat[cy+2][cx];
    }
    if (dir==3) {
        if (!inmat(cy, cx+2, v, s)) return -1;
        return mat[cy][cx+2];
    }
    if (dir==4) {
        if (!inmat(cy-2, cx, v, s)) return -1;
        return mat[cy-2][cx];
    }

}


int main() {
  int v = 7, s = 9, x = 4, y = 6, mat[7][9], i, j, l, k;
  
  // cursor
  int cx, cy;
  cx=((int)s/2);
  cy=((int)v/2);
  printf("cx - %4d, xy - %4d\n", cx, cy);
  
  
  
  int dir=1; // direction, 1 - left, 2 - down, 3 - right, 4 - up
  
  int dv;
  
  for (i = 0; i < v; i++)
    for (j = 0; j < s; j++)
      mat[i][j] = y;
  
  mat[cy][cx]=0; // start
  // spiral goes here
  for (i = 0; i < s*v/2; i++) {


    if (dir==1) {
        if (inmat(cy, cx-1, v, s)) mat[cy][cx-1]=x;
        if (inmat(cy, cx-2, v, s)) mat[cy][cx-2]=x;
        cx=cx-2;
    }
    if (dir==2) {
        if (inmat(cy+1, cx, v, s)) mat[cy+1][cx]=x;
        if (inmat(cy+2, cx, v, s)) mat[cy+2][cx]=x;
        cy=cy+2;
    }
    if (dir==3) {
        if (inmat(cy, cx+1, v, s)) mat[cy][cx+1]=x;
        if (inmat(cy, cx+2, v, s)) mat[cy][cx+2]=x;
        cx=cx+2;
    }
    if (dir==4) {
        if (inmat(cy-1, cx, v, s)) mat[cy-1][cx]=x;
        if (inmat(cy-2, cx, v, s)) mat[cy-2][cx]=x;
        cy=cy-2;
    }

    dv=dirval(cx, cy, v, s, incdir(dir), mat);
    if (dv==y || dv==-1) dir=incdir(dir);

  }

  for (i = 0; i < v; i++) {
    for (j = 0; j < s; j++) 
      printf("%4d", mat[i][j]);
    printf("\n");
  }
  return 0;
}