2012-01-26 6 views
2

ダイヤモンド型の等尺性マップを想像してください。これは基本的に(x、y)座標と最上位セルを原点とする2D配列です細胞:ダイヤモンド型アイソメメトリーマップの先頭から最後まで繰り返す方法

Diamond

私は次の順序で、後ろから前にこれらの細胞を反復処理したい:

 iteration order

不明same-を通じて、このようにループするためのアルゴリズムは何両面m AP?

予想される出力:[0,0]、[0,1]、[1,0]、[0,2]、[1,1]、[2,0]、[0,3]など

答えて

3

パイソン擬似コード

def iterate_cells(n): 
    for i in range(n): 
     for j in range(i+1): 
      yield (j, i-j) 
    for i in range(1, n+1): 
     for j in range(n - i): 
      yield(i+j, n-j-1) 

出力:提出

In [119]: list(iterate_cells(5)) 
Out[119]: 
[(0, 0), 
(0, 1), 
(1, 0), 
(0, 2), 
(1, 1), 
(2, 0), 
(0, 3), 
(1, 2), 
(2, 1), 
(3, 0), 
(0, 4), 
(1, 3), 
(2, 2), 
(3, 1), 
(4, 0), 
(1, 4), 
(2, 3), 
(3, 2), 
(4, 1), 
(2, 4), 
(3, 3), 
(4, 2), 
(3, 4), 
(4, 3), 
(4, 4)] 
+0

ああ、 (4,0)までしか表示されません。しかし、ありがとう!私はこれを行う簡単な方法があることを知っていた、私のアルゴリズムは、ifsとwhiles、うつ病でいっぱいでした:) –

+0

本当に、私は下部もそれを更新しました – fortran

+0

これは素晴らしいです。ありがとうございました! [これはCoffee-Script/JSの同等物です](https://gist.github.com/293566e1eaeb278e1170#file-zigzagarray-コーヒー)誰でもキャンバスプロジェクトなどに必要なものです。 – RayViljoen

0

マップは行列M(nは、n)の中に含まれて考える:

// lateral loop above diagonal 
for (int i=0; i<n; i++) { 
    // diagonal loop 
    for (int j=0; j<i; j++) { 
    // the coords you are looking for are: row=(i-j), col=(i+j) 
    int currentTileValue = M[i-j, i+j]; 
    } 
} 
// sub-diagonal lateral loop 
for (int j=1; j<n; j++) { 
    // diagonal loop 
    for (int i=0; i<(n-j); i++) { 
    // the coords you are looking for are: row=(j-i), col=(j+i) 
    int currentTileValue = M[j-i, j+i]; 
    } 
} 

は詳細にそれをテストしていないが、私はそれがうまくいくと思うと思います。とにかくあなたはアイデアを得る。

+0

ありがとう! 残念ながら、最初の "for"の条件はオフに見えます。これらの値を使用すると、条件は合格し、値は範囲外になります。 M(5,5) i = 4 j = 2 i + j> 5であるため、 –

関連する問題