【问题标题】:Loop diagonally through 2D array in one loop在一个循环中对角循环通过 2D 数组
【发布时间】:2014-03-24 00:53:57
【问题描述】:

如何在一个循环中遍历整个二维数组 例如

我想将对角线元素 push_back 到一个缓冲区中进行处理:2 到 2、3 到 3、4 到 4 我曾尝试在两个单独的循环中执行此操作,但之后我无法将它们一起处理。

示例二维数组:

0 1 2 3 4 5 6 
1 * * * * * *
2 * * * * * *
3 * * * * * *
4 * * * * * *
5 * * * * * *
6 * * * * * *

因此,(0,1) 到 (1,0) 的缓冲区将是:网格中的一颗星

(0,2) 到 (2,0) 的缓冲区:两颗星

(0,3) 到 (3,0) 的缓冲区:三颗星

等等……

注意缓冲区是一个字符串。

【问题讨论】:

  • 对不起,我不明白你的意思。你想要对角线元素,还是像你在这里提到的:“这些边界之间的所有元素”?
  • 对角线元素。所以我推回(0,1)和(1,0)之间的对角线元素,然后推回(0,2)和(2,0)之间的对角线元素
  • 请澄清。示例打算以 data[0][0] 作为左上角的起点,对吗?
  • 在这种情况下,您可以在单个循环中使用a[i][n-i]
  • 我更新了一些我的 cmets 和 post 人。我从左上角开始循环到右下角。

标签: c++ arrays multidimensional-array diagonal


【解决方案1】:

如果您想获得所有对角线元素for 循环将如下所示:

for(unsigned int i=0;i<yourArrayWidth;i++)
   yourSum += yourArray[i][i];

如果你想要从左上角到右下角的数字(所以“\”),或者:

for(unsigned int i=0;i<yourArrayWidth;i++)
   yourSum += yourArray[yourArrayWidth-i][i];

如果你想要从右上角到左下角的数字(所以“/”)。

地点:

  • yourSum 是您在遍历之前初始化的一些缓冲区。
  • yourArrayWidth 是数组的宽度。
  • yourArray 是您示例中的二维数组,从 [0][0] 开始。

【讨论】:

    【解决方案2】:

    对于M 行和N 列的数组,您将拥有num=N+M-1 对角线,每个都可以通过以下方式获得:

    int num = N+M-1;
    int len = 1;
    std::vector<std::string> res;
    for (int i=0; i<num; ++i)
    {
      int startRow = std::min(i, M-1);
      int startCol = i-startRow;
      int len      = std::min(startRow, N-1-startCol) + 1;
      std::string str(len, '\0');
      for (int j=0; j<len; ++j)
      {
        str[j] = arr[startRow-j][startCol+j];
      }
      res.push_back(str);
    }
    

    i=0 是左上角的“/”对角线,i=N+M-1 是右下角的对角线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 2018-01-21
      • 1970-01-01
      • 2013-08-19
      • 2014-06-29
      相关资源
      最近更新 更多