【问题标题】:Go through all the major diagonals in matrix, including principal遍历矩阵中的所有主要对角线,包括主对角线
【发布时间】:2020-01-10 12:12:54
【问题描述】:

如何遍历矩阵中的所有对角线?有类似的问题,比如this 一个,但他们只是计算总和。我需要通过所有对角线执行某些操作,而不仅仅是求和。为了清楚起见,我需要像图片中那样遍历它:

我想出了这个解决方案,但是很糟糕:

for(int j = 0; j < m; j++) {
        for(int i = 0; i < n && i + j < m; i++) {
            cout << matrix[i][i + j] << " ";
        }
        cout << endl;
    }
for(int i = 1; i < n; i++) {
        for(int j = 0; j < m && i + j < n; j++) {
            cout << matrix[j + i][j] << " ";
        }
        cout << endl;
    }

对于矩阵 n*m,我首先从主对角线向右遍历每个对角线,然后从主对角线向左遍历,但这个解决方案对我来说似乎很难看。

【问题讨论】:

  • 您需要第一个循环来迭代地找到每个对角线的起点,然后需要一个内部循环来跟随每个对角线。你在哪里被屏蔽了?
  • @Damien 将其压缩到只有一个带有内循环的循环。我想出了一个解决方案,它需要两个循环,都带有内部循环,但它看起来很糟糕。我将其添加到问题中
  • 请注意,对于两个循环,while 循环似乎比 for 循环更容易控制
  • 你的内部循环并没有真正穿过对角线。为此,您必须同时增加 ij
  • 你必须从主对角线开始吗?如果没有,你可以很容易地只获得一个内循环

标签: algorithm matrix


【解决方案1】:

您可以以模运算为代价使用更简单的迭代:

for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        cout << a[(i+j)%n][j] << " ";
    }
    cout << endl;
}

【讨论】:

    【解决方案2】:

    您需要第一个循环来找到每个对角线的起点,并需要第二个循环来跟随对角线。

    这里是一个伪代码,假设点 (0, 0) 是低点。

    (i_start, j_start) = (1, 0)
    While (1)
        If (i_start, j_start) out of bound: break
        (i, j) = (i_start, j_start)
        While (1)
             If (i, j) out of bound: break
             Write matrix[i][j]
             i--, j++
        End while
        If (i_start not max) i_start++
        Else j_start++
    End while
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多