C++:以对角线方式处理二维数组元素

标签 c++ arrays loops nested 2d

假设我们有一个二维数组,arr[N][N],其中N 是一个常量整数。 假设 arr 的每个元素都已初始化。

如何使用嵌套的 for 循环打印 arr 反对角线的元素?

我的意思是:

  • 最外层循环的第一次迭代后,arr[0][0] 将被打印
  • 在最外层循环的第二次迭代后,arr[0][1]arr[1][0] 将被打印
  • 在最外层循环的第三次迭代之后,arr[0][2]arr[1][1]arr[2 ][0] 将被打印
  • ...
  • 在最外层循环的最后一次迭代之后,将打印 arr[N-1][N-1]

感谢您的宝贵时间!

最佳答案

对所有写下“下半场应该相似”的人感到抱歉……不是。

无论如何,给你:

// traverse array diagonally
int c, tmp, x;
for (c = N - 1; c > -N; c--) {
    tmp = N - abs(c) - 1;
    x = tmp;
    while (x >= 0) {
        if (c >= 0) {
            std::cout << arr[x][tmp - x] << ", ";
        }
        else {
            std::cout << arr[N - (tmp - x) - 1][(N-1)-x] << ", ";
        }
        --x;
    }
    std::cout << "\n";
}

你需要这个来玩游戏吗?

[edit] 再看一遍,我觉得我的回答写得不是很好。这是一个快速浏览:

假设 N 是 3。

我们需要的是对坐标组合的迭代,如下所示:

(0, 0)
(1, 0), (0, 1)
(2, 0), (1, 1), (0, 2)
(2, 1), (1, 2)
(2, 2)

首先是一些占位符:

int c,    // a counter, set by the outer loop
    tmp,  // for intermediate results
    x;    // the x-index into *arr* (*y* will be defined implicitly)

现在这个外循环

for (c = N - 1; c > -N; c--) { 

使 c 迭代 {2, 1, 0, -1, 2}

下一步

    tmp = N - abs(c) - 1;
    x = tmp;

{2, 1, 0, -1, -2} 变成 {0, 1, 2, 1, 0},这是此步骤所需的输出减一(因此它们可以用作索引)。我们制作了两个拷贝,tmpx

现在我们从 x 倒数到 0:

    while (x >= 0) {
        ...
        --x;
    }

如果我们在 arr 的左上半部分,用 c >= 0 表示,arr 的 x 索引需要从对角线开始并下降到零 (0 to 0, 1 to 0 and 2 to 0) ,而 y 索引需要从零开始并上升到对角线 (0 到 0、0 到 1 和 0 到 2):

        if (c >= 0) {
            std::cout << arr[x][tmp - x] << ", ";
        }

一旦我们位于右下半部分,x 索引需要从 N 开始并向下到对角线 (2 到 1 和 2 到 2),而 y 索引需要从对角线开始并上升到 N(1 到 2 和 2 到 2):

        else {
            std::cout << arr[N - (tmp - x) - 1][(N-1)-x] << ", ";
        }

最后我们只需要在每一行的末尾换行:

    std::cout << "\n";

萨维? :-)

关于C++:以对角线方式处理二维数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6150382/

相关文章:

c++ - 如何使用 Ximea 在 C++ 中存储图像

javascript - 将数组的随机正值转换为负值

sql - PL/SQL 循环游标

javascript - js中数组从零开始递增

python - 带条件的嵌套循环中的 lambda

java - 如何创建一个包含比较元素以获得最高元素的数组的方法?

c++ - UTF-8 char * 到 CString 的转换

c++ - 在 Linux 上编译错误但在 MacOSX 上没有

c++ - 在二进制文件中读取和写入字符串c++

java - 每当有新元素加入时,如何让数组中的元素移动 +1