1. ホーム
  2. algorithm

[解決済み] スパイラルでループする

2022-05-02 05:28:41

質問

友人がNxM行列(NとMは奇数)の要素を通してループさせるアルゴリズムを必要としていました。私は解決策を思いついたが、私は仲間のSO'erがより良い解決策を思いつくかどうかを知りたかった。

この質問に対する回答として、私の解答を掲載します。

出力例です。

3x3の行列の場合、出力は以下のようになるはずです。

(0, 0) (1, 0) (1, 1) (0, 1) (-1, 1) (-1, 0) (-1, -1) (0, -1) (1, -1)

さらに、アルゴリズムは非正方行列をサポートする必要があり、例えば5x3行列の場合、出力は次のようになります。

(0, 0) (1, 0) (1, 1) (0, 1) (-1, 1) (-1, 0) (-1, -1) (0, -1) (1, -1) (2, -1) (2, 0) (2, 1) (-2, 1) (-2, 0) (-2, -1)

解決方法は?

以下は、私の解決策です(Pythonで)。

def spiral(X, Y):
    x = y = 0
    dx = 0
    dy = -1
    for i in range(max(X, Y)**2):
        if (-X/2 < x <= X/2) and (-Y/2 < y <= Y/2):
            print (x, y)
            # DO STUFF...
        if x == y or (x < 0 and x == -y) or (x > 0 and x == 1-y):
            dx, dy = -dy, dx
        x, y = x+dx, y+dy