【问题标题】:Traversal matrix in "circle"“圆”中的遍历矩阵
【发布时间】:2018-10-27 23:23:00
【问题描述】:

我不知道如何按特殊顺序遍历数组中的元素。输入数组如下所示:

我需要这样去

我想到的唯一方法是某种蛮力:

int Rings[][] = new int [3][12];
for (int i = 0; i < 3; i++) {
            Rings[i][0] = matrix[2-i][5];
            Rings[i][1] = matrix[2-i][4];
            Rings[i][2] = matrix[2-i][3];
            Rings[i][3] = matrix[3][2-i];
            Rings[i][4] = matrix[4][2-i];
            Rings[i][5] = matrix[5][2-i];
            Rings[i][6] = matrix[6+i][3];
            Rings[i][7] = matrix[6+i][4];
            Rings[i][8] = matrix[6+i][5];
            Rings[i][9] = matrix[5][6+i];
            Rings[i][10] = matrix[4][6+i];
            Rings[i][11] = matrix[3][6+i];
}
//Rings[0] = 9,6,3,7,8,9,1,4,7,3,2,1
//Rings[1] = 8,5,2,4,5,6,2,5,8,6,5,4
//Rings[2] = 7,4,1,1,2,3,3,6,9,9,8,7

如果它是 9x9 看起来还不错,但如果它会更大,即使使用 10x10 数组“Rings”也将是 16。是否可以在不接触角元素的情况下以圆形方式遍历矩阵?顺时针或逆时针都无所谓,从哪个圆圈开始,也无所谓。

【问题讨论】:

  • 请问您能否发布问题陈述或提供链接?
  • @amrender singh 据我了解,您想知道我为什么要问这个问题并提出这个问题?我只是在玩数独和遍历矩阵之字形/螺旋等的方法,并问自己是否可以用“圆圈”遍历。
  • 如何定义角矩阵?他们总是 3x3 吗?在那种情况下,这个问题的矩阵的最小尺寸应该是 9x9 对吧?
  • @SomeDude 整个输入数组是矩阵,为了便于理解,我用“-1”定义矩阵的中心和角部分。不,它们可以是 4x4、5x5 等。最小尺寸可能是 1x1。

标签: arrays algorithm loops matrix


【解决方案1】:

注意每个环的 4 个边都有一个不变的索引,并转换为 4 个 for 循环:

for (int i = 0; i < 3; i++)
{
   int j = 0;
   for (int k = 5; k > 2; k--)
      Rings[i][j++] = matrix[2-i][k];
   for (int k = 3; k < 6; k++)
      Rings[i][j++] = matrix[k][2-i];
   for (int k = 3; k < 6; k++)
      Rings[i][j++] = matrix[6+i][k];
   for (int k = 5; k > 2; k--)
      Rings[i][j++] = matrix[6+i][k];
}

推广到网格大小N:

  • 2 - i 中的2 替换为N - 1(内循环,左/上)
  • 6 + i 中的6 替换为2 * N(内循环,右/下)

代码:

for (int i = 0; i < N; i++)
{
   int j = 0;
   for (int k = 2 * N - 1; k >= N; k--)
      Rings[i][j++] = matrix[N - 1 - i][k];
   for (int k = N; k < 2 * N; k++)
      Rings[i][j++] = matrix[k][N - 1 - i];
   for (int k = N; k < 2 * N; k++)
      Rings[i][j++] = matrix[2 * N + i][k];
   for (int k = 2 * N - 1; k >= N; k--)
      Rings[i][j++] = matrix[2 * N + i][k];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-12
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2018-02-16
    • 2016-03-17
    相关资源
    最近更新 更多