【问题标题】:Unable to figure out logic for diagonal matrix printing无法弄清楚对角矩阵打印的逻辑
【发布时间】:2016-07-14 02:30:11
【问题描述】:

我确实对此进行了很多思考,并且能够计算出所有变量和计数器的运行情况以及我们如何得出结果。

但是,是否有任何逻辑支持 Mark Byer 的解决方案 here,或者只是调整了所有计数器都到位?

请给我一个算法的逻辑解释

代码

#include <stdio.h>

int main()
{
    int x[3][3] = {1, 2, 3,
                   4, 5, 6,
                   7, 8, 9};
    int n = 3;
    for (int slice = 0; slice < 2 * n - 1; ++slice) {
        printf("Slice %d: ", slice);
        int z = slice < n ? 0 : slice - n + 1;
        for (int j = z; j <= slice - z; ++j) {
            printf("%d ", x[j][slice - j]);
        }
        printf("\n");
    }
    return 0;
}

【问题讨论】:

    标签: arrays matrix


    【解决方案1】:

    马克的回答是正确的,适用于任何n。也许马克应该将他的变量命名为diagonal 而不是slice

    查看对角线的起点和终点的前进方式,对于n = 3

           start ->
    end   a - b - c
     |    |       |
     \/   h       d
          |       |
          g - f - e
    

    对于每个对角线,起始索引遵循路径:a-b-c-d-e,结束索引遵循路径:a-h-g-f-e。为了穿越对角线,我们需要向西南方向行进,即我们访问的每个下一个点都在下方一排,向左一列。因此,对角线是:a-ab-hc-gd-fe-e

    对于初学者,您可以考虑在我们以任何一种方式超出边界时结束每个对角线的遍历(请记住,我们正在增加行并减少列,总是)。 Mark 的回答也在循环变量中捕捉到了这一点。

    我们还需要看到对角线的数量总是n + (n - 1) = 2 * n - 1

    下表截取了上图的对角线:

    d#       start    end
    ----------------------
    0       (0, 0)   (0, 0)
    1       (0, 1)   (1, 0)
    2       (0, 2)   (2, 0)
    3       (1, 2)   (2, 1)
    4       (2, 2)   (2, 2)
    

    现在,因为一旦我们知道start(即向西南方向前进,直到超出界限),我们总是可以捕获end,我们需要关注d#start的关系.

    如果您为n = 4 绘制了类似的图表/表格,也许您可​​以看到模式并根据d# 捕获第一个循环的变量。

    【讨论】:

    • 这个解决方案可以扩展到矩形矩阵吗?
    • 是的,我想是的,但当然需要在mn 方面进行更多操作。
    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2014-02-16
    • 2015-09-19
    • 2023-01-29
    相关资源
    最近更新 更多