creating a spiral array in python?

前端 未结 8 629
感情败类
感情败类 2020-12-05 03:16

Me and my mate were trying to create a fun game in python where the elements entered in the array are accessed in a spiral manner. I have tried few methods like one given be

8条回答
  •  渐次进展
    2020-12-05 04:08

    You can build a spiral by starting near the center of the matrix and always turning right unless the element has been visited already:

    #!/usr/bin/env python
    NORTH, S, W, E = (0, -1), (0, 1), (-1, 0), (1, 0) # directions
    turn_right = {NORTH: E, E: S, S: W, W: NORTH} # old -> new direction
    
    def spiral(width, height):
        if width < 1 or height < 1:
            raise ValueError
        x, y = width // 2, height // 2 # start near the center
        dx, dy = NORTH # initial direction
        matrix = [[None] * width for _ in range(height)]
        count = 0
        while True:
            count += 1
            matrix[y][x] = count # visit
            # try to turn right
            new_dx, new_dy = turn_right[dx,dy]
            new_x, new_y = x + new_dx, y + new_dy
            if (0 <= new_x < width and 0 <= new_y < height and
                matrix[new_y][new_x] is None): # can turn right
                x, y = new_x, new_y
                dx, dy = new_dx, new_dy
            else: # try to move straight
                x, y = x + dx, y + dy
                if not (0 <= x < width and 0 <= y < height):
                    return matrix # nowhere to go
    
    def print_matrix(matrix):
        width = len(str(max(el for row in matrix for el in row if el is not None)))
        fmt = "{:0%dd}" % width
        for row in matrix:
            print(" ".join("_"*width if el is None else fmt.format(el) for el in row))
    

    Example:

    >>> print_matrix(spiral(5, 5))
    21 22 23 24 25
    20 07 08 09 10
    19 06 01 02 11
    18 05 04 03 12
    17 16 15 14 13
    

提交回复
热议问题