11

ここで同じことを行う必要がありますが、正方形の行列だけでなく、任意の行列で作業する必要があります。また、トラバーサルの方向は反対である必要があります。そこで見つけたコードを編集しようとしましたが、理解できませんでした。

ありがとう。

4

1 に答える 1

23

私はそれを書いたことを覚えています。長方形の行列の場合、いくつかの小さな変更と、理解できないナンセンスのもう1行が必要になると思います。

#include <stdio.h>

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

出力:

Slice 0: 1
Slice 1: 5 2
Slice 2: 9 6 3
Slice 3: 10 7 4
Slice 4: 11 8
Slice 5: 12

それがどのように機能するかを簡単に説明するために、各スライスは最初の列から始まり、斜めに直立し、最初の行で終わる対角線です(元々は左下ですが、ポスターからのコメントの結果として交換されました)。

z2は、最初の数字を印刷する前にスキップする必要があるアイテムの数を示します。これは、最初のmスライスではゼロであり、残りのスライスごとに1ずつ増加します。z1は、最後にスキップする必要のあるアイテムの数です。最初のmスライスではゼロから開始し、残りのスライスでは1ずつ増加します。

于 2010-01-21T21:12:25.067 に答える