差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
programming_algorithm:grid [2020/08/06] – ikatakos | programming_algorithm:grid [2020/08/06] – [1次元化] ikatakos | ||
---|---|---|---|
行 144: | 行 144: | ||
「上下左右への探索」で紹介したのと同様に、1次元で配列を持ちたい場合。 | 「上下左右への探索」で紹介したのと同様に、1次元で配列を持ちたい場合。 | ||
- | ただし、外壁は作っていない(外壁を含めて全体をイテレートする)とする。 | + | ただし、外壁を作っている場合でも、外壁を含めて全体をイテレートするとする。 |
- | 統一的に書くのは難しいので、↘方向と↙方向、それぞれ2回に分けて書くとする。 | + | 統一的に書くのは難しいので、↘方向と↙方向、それぞれ2回に分けて書く。 |
<sxh python> | <sxh python> | ||
行 212: | 行 212: | ||
# [18] | # [18] | ||
</ | </ | ||
+ | |||
+ | |||
+ | もうちょっとスッキリさせたやつ。min, | ||
+ | |||
+ | <sxh python> | ||
+ | h = 4 | ||
+ | w = 6 | ||
+ | grid = list(range(h * w)) | ||
+ | |||
+ | |||
+ | def iter_ld(i): | ||
+ | while True: | ||
+ | yield i | ||
+ | d, m = divmod(i, w) | ||
+ | if d == h - 1 or m == 0: | ||
+ | break | ||
+ | i += w - 1 | ||
+ | |||
+ | |||
+ | def iter_rd(i): | ||
+ | while True: | ||
+ | yield i | ||
+ | d, m = divmod(i, w) | ||
+ | if d == h - 1 or m == w - 1: | ||
+ | break | ||
+ | i += w + 1 | ||
+ | |||
+ | |||
+ | # ↙方向、最上段開始 | ||
+ | for k in range(w): | ||
+ | for i in iter_ld(k): | ||
+ | pass | ||
+ | |||
+ | # ↙方向、最右列開始 | ||
+ | for k in range(1, h): | ||
+ | for i in iter_ld(w - 1 + k * w): | ||
+ | pass | ||
+ | |||
+ | # ↘方向、最上段開始 | ||
+ | for k in range(-w + 1, 1): | ||
+ | for i in iter_rd(-k): | ||
+ | pass | ||
+ | |||
+ | # ↘方向、最左列開始 | ||
+ | for k in range(1, h): | ||
+ | for i in iter_rd(k * w): | ||
+ | pass | ||
+ | </ | ||
+ | |||