2016-07-14 4 views
0

私はこれについて非常に多くのことを考え、すべての変数とカウンタがどう動いているのか、結果にどのように到達するのかを考え出すことができました。対角マトリックス印刷のロジックを見つけることができません

しかし、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; 
} 

答えて

1

Markの答えが正解であり、任意のnのために動作しますのための論理的な説明をお願いします。 Markはsliceの代わりに彼の変数diagonalの名前を付けたはずです。 n = 3ための対角線始点と終点が進んでいる道で

見て、

:各対角線については

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

は、開始インデックスは、パスは以下:a-b-c-d-eをして終了インデックスは、経路をたどる:a-h-g-f-e 。そして、南西方向に移動する必要がある対角線を横断するために、すなわち、我々が訪れる次の各点は、1つ下の列と1つの列の左にある。従って、対角線は、a-a,b-h,c-g,d-f,e-eである。

どちらの方法でも外れたときに、各対角線のトラバーサルを終了すると思います(覚えておいて、行を増やして列を減らしています)。は常にです。マークの答えはそれもループ変数でキャプチャされています。

対角線の数が常に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をキャプチャすることができるので、私たちは、 とstartの関係に焦点を当てる必要があります。

n = 4の同様の図表を作成した場合は、パターンを確認して、最初のループの変数をとして取り込むことができます。

+0

Kedarに感謝します。これは私には役に立ちました。 – saltmangotree

+0

このソリューションは長方形のマトリックスに拡張可能ですか? – saltmangotree

+0

はい、私はそうだと思いますが、もちろんmとnの操作をもう少し必要とします。 –

関連する問題