Looping in a spiral

前端 未结 30 2670
独厮守ぢ
独厮守ぢ 2020-11-22 15:07

A friend was in need of an algorithm that would let him loop through the elements of an NxM matrix (N and M are odd). I came up with a solution, but I wanted to see if my fe

30条回答
  •  無奈伤痛
    2020-11-22 15:30

    Your question looks like a question called spiral memory. In that problem, each square on the grid is allocated in a spiral pattern starting from the number 1 which locates at the origin. And then counting up while spiraling outwards. For example:

    17  16  15  14  13
    
    18   5   4   3  12
    
    19   6   1   2  11
    
    20   7   8   9  10
    
    21  22  23  ---->
    

    My solution for computing the coordinates of each number following this spiral pattern is posted below:

    def spiral_pattern(num):
        x = y = 0
        for _ in range(num-1):
            x, y = find_next(x, y)
        yield (x, y)
    
    
    def find_next(x, y):
        """find the coordinates of the next number"""
        if x == 0 and y == 0:
            return 1, 0
    
        if abs(x) == abs(y):
            if x > 0 and y > 0:
                x, y = left(x, y)
            elif x < 0 and y > 0:
                x, y = down(x, y)
            elif x < 0 and y < 0:
                x, y = right(x, y)
            elif x > 0 and y < 0:
                x, y = x+1, y
        else:
            if x > y and abs(x) > abs(y):
                x, y = up(x, y)
            elif x < y and abs(x) < abs(y):
                x, y = left(x, y)
            elif x < y and abs(x) > abs(y):
                x, y = down(x, y)
            elif x > y and abs(x) < abs(y):
                x, y = right(x, y)
    
        return x, y
    
    def up(x, y):
        return x, y+1
    
    
    def down(x, y):
        return x, y-1
    
    
    def left(x, y):
        return x-1, y
    
    
    def right(x, y):
        return x+1, y
    

提交回复
热议问题