差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
次のリビジョン両方とも次のリビジョン
programming_algorithm:grid [2020/07/29] – [斜めに見る] ikatakosprogramming_algorithm:grid [2020/07/29] – [実装例] ikatakos
行 65: 行 65:
 $H \times W$ のグリッドにおいて、 $H \times W$ のグリッドにおいて、
  
-  * $i+j$ の取り得る範囲は、$0~H+W$ +  * $i+j$ の取り得る範囲は、$0~H+W-2
-  * $i-j$ の取り得る範囲は、$-W~H$ → 便宜的に $W$ を足すと、$0~H+W$ になる+  * $i-j$ の取り得る範囲は、$-W+1~H-1$便宜的に $W-1$ を足すと、$0~H+W-2$
  
 +==== 実装例 ====
 +
 +ナナメ列ごとに、全てのマスを走査する。
 +
 +<sxh python>
 +h, w = 4, 5
 +grid = [list(range(i * w, (i + 1) * w)) for i in range(h)]
 +
 +for row in grid:
 +    print(row)
 +# [ 0,  1,  2,  3,  4]
 +# [ 5,  6,  7,  8,  9]
 +# [10, 11, 12, 13, 14]
 +# [15, 16, 17, 18, 19]
 +
 +# ↙
 +for ij in range(h + w - 1):  # i+j
 +    diag = []
 +    i_min = max(0, ij - w + 1)
 +    i_max = ij - max(0, ij - h + 1)
 +    for i in range(i_min, i_max + 1):
 +        j = ij - i
 +        diag.append(grid[i][j])
 +    print(diag)
 +# [0]
 +# [1, 5]
 +# [2, 6, 10]
 +# ...
 +
 +# ↘
 +for ij in range(-w + 1, h):  # i-j
 +    diag = []
 +    i_min = max(0, ij)
 +    i_max = ij + min(w - 1, h - ij - 1)
 +    for i in range(i_min, i_max + 1):
 +        j = i - ij
 +        diag.append(grid[i][j])
 +    print(diag)
 +# [4]
 +# [3, 9]
 +# [2, 8, 14]
 +# ...
 +
 +</sxh>
 ==== 位置合わせ ==== ==== 位置合わせ ====
  
行 91: 行 135:
  
   * 「\」方向は、左上のマスを $(i,j)$ とすると、indexは $\dfrac{i+j}{2}$(切り捨て)より開始   * 「\」方向は、左上のマスを $(i,j)$ とすると、indexは $\dfrac{i+j}{2}$(切り捨て)より開始
-  * 「/」方向は、右上のマスを $(i,j)$ とすると、indexは $\dfrac{i-j+W}{2}$(切り捨て)より開始+  * 「/」方向は、右上のマスを $(i,j)$ とすると、indexは $\dfrac{i-j+W-1}{2}$(切り捨て)より開始
programming_algorithm/grid.txt · 最終更新: 2020/08/12 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0