The Algorithms logo
The Algorithms
AboutDonate

Spiral Print

W
b
"""
This program print the matrix in spiral form.
This problem has been solved through recursive way.

      Matrix must satisfy below conditions
        i) matrix should be only one or two dimensional
        ii) number of column of all rows should be equal
"""

from collections.abc import Iterable


def check_matrix(matrix):
    # must be
    if matrix and isinstance(matrix, Iterable):
        if isinstance(matrix[0], Iterable):
            prev_len = 0
            for row in matrix:
                if prev_len == 0:
                    prev_len = len(row)
                    result = True
                else:
                    result = prev_len == len(row)
        else:
            result = True
    else:
        result = False

    return result


def spiralPrint(a):
    if check_matrix(a) and len(a) > 0:
        matRow = len(a)
        if isinstance(a[0], Iterable):
            matCol = len(a[0])
        else:
            for dat in a:
                print(dat),
            return

        # horizotal printing increasing
        for i in range(0, matCol):
            print(a[0][i]),
        # vertical printing down
        for i in range(1, matRow):
            print(a[i][matCol - 1]),
        # horizotal printing decreasing
        if matRow > 1:
            for i in range(matCol - 2, -1, -1):
                print(a[matRow - 1][i]),
        # vertical printing up
        for i in range(matRow - 2, 0, -1):
            print(a[i][0]),
        remainMat = [row[1 : matCol - 1] for row in a[1 : matRow - 1]]
        if len(remainMat) > 0:
            spiralPrint(remainMat)
        else:
            return
    else:
        print("Not a valid matrix")
        return


# driver code
if __name__ == "__main__":
    a = ([1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12])
    spiralPrint(a)