1. 程式人生 > >列印之字矩陣

列印之字矩陣

題目資訊
題目意思是這樣列印矩陣
在這裡插入圖片描述

分析一下

可以考慮 要這樣列印矩陣 要考慮 斜著列印,通過兩個點 來定義 一條斜線, 然後 列印這個 斜線 上的 所有點,就可以了. 下圖就是分析思路:

定義 A , B 兩點, 每個點都有自己的行動軌跡, A 向 右走, 走到 最右邊, 往下走.
B 先 向下走, 走到最後一行,開始向右走,
A 和B 最終 會相遇, 如果 A 和B 再次 相遇, 則 A 和B 已經把整個 矩陣 走完了.

圖片1
img

在這裡插入圖片描述


def test_print_matrix_zig(matrix):
    # A 點
    a_r, a_c = 0, 0

    # B 點
    b_r, b_c = 0, 0

    row, column = matrix.shape

    #  矩形對應的 index 下標
    row_index = row - 1
    column_index = column - 1

    while True:
        print('-------------')

        # A 向 右走, 之後 向下走
        a_r = a_r + 1 if a_c == column_index else a_r
        a_c = a_c if a_c == column_index else a_c + 1

        # B 向下走,之後 向右走
        b_c = b_c + 1 if b_r == row_index else b_c
        b_r = b_r if b_r == row_index else b_r + 1

        A = (a_r, a_c)
        B = (b_r, b_c)

        print(f"A:{A},B:{B}")
        if A == B:
            print('A==B  break')
            break


if __name__ == '__main__':
    matrix = np.arange(0, 24).reshape((4, 6))

    test_print_matrix_zig(matrix)

    print(f"\nmatrix:\n{matrix}")

    pass



result :

A:(0, 1),B:(1, 0)
-------------
A:(0, 2),B:(2, 0)
-------------
A:(0, 3),B:(3, 0)
-------------
A:(0, 4),B:(3, 1)
-------------
A:(0, 5),B:(3, 2)
-------------
A:(1, 5),B:(3, 3)
-------------
A:(2, 5),B:(3, 4)
-------------
A:(3, 5),B:(3, 5)
A==B  break

matrix:
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

程式 能夠正常 列印了, A, B 點 走的位置, 最後 A 和 B 同時到達了, (3,5) 位置, 程式 就退出了.

  • 下面思考如何 列印 A, B 連線的一條線的 的值呢? 如圖所示
    image

在這裡插入圖片描述


def print_line(matrix, a_r, a_c, b_r, b_c, reverse=True):
    """


    A (a_r,a_c)
    B (b_r,b_c)

    :param matrix:
    :param a_r:
    :param a_c:
    :param b_r:
    :param b_c:
    :param reverse: bool 
    :return:
    """
    if reverse:
        while a_r != b_r + 1:
            # 從A 右上  --> B 左下 列印
            print(matrix[a_r][a_c], end=' ')
            a_r += 1
            a_c -= 1
    else:
        while b_c != a_c + 1:
            # 從B左下, --->  A 右上 列印
            print(matrix[b_r][b_c], end=' ')
            b_r -= 1
            b_c += 1

    # print('-------' * 5)

來測試一下這個函式

if __name__ == '__main__':
    matrix = np.arange(0, 24).reshape((4, 6))

    print_line(matrix, 0, 3, 3, 0, reverse=True)

    print()
    print_line(matrix, 0, 3, 3, 0, reverse=False)

    print(f"\nmatrix:\n{matrix}")

result: 可以正常的列印A–> B 邊上的點的值. 也可以 從 B --> A 列印.

3 8 13 18 
18 13 8 3 
matrix:
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
 
  • 要完成 之字列印把這兩部分 拼起來就可以了.

完整 程式碼如下, 因為要實現不同的方向的列印所以加了 一個布林變數來控制列印方向.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@Time    : 2019/1/5 10:48
@File    : print_matrix_zig_zag.py
@Author  : [email protected]


之” 字形列印矩陣
【 題目】 給定一個矩陣matrix, 按照“之” 字形的方式列印這
個矩陣, 例如: 1 2 3 4 5 6 7 8 9 10 11 12
“之” 字形列印的結果為: 1, 2, 5, 9, 6, 3, 4, 7, 10, 11,
8, 12
【 要求】 額外空間複雜度為O(1)



"""

import numpy as np


def print_line(matrix, a_r, a_c, b_r, b_c, reverse=True):
    """


    A (a_r,a_c)
    B (b_r,b_c)

    :param matrix:
    :param a_r:
    :param a_c:
    :param b_r:
    :param b_c:
    :param reverse:
    :return:
    """
    if reverse:
        while a_r != b_r + 1:
            # 從 右上  -->  左下 列印
            print(matrix[a_r][a_c], end=' ')
            a_r += 1
            a_c -= 1
    else:
        while b_c != a_c + 1:
            # 從左下, --->  右上 列印
            print(matrix[b_r][b_c], end=' ')
            b_r -= 1
            b_c += 1

    # print('-------' * 5)


def _print_matrix_zig_zag(matrix):
    a_r, a_c = 0, 0

    b_r, b_c = 0, 0

    #
    row, column = matrix.shape

    print(f"row:{row},column:{column}")

    from_up = True
    while True:
        # print_line(matrix, a_r, a_c, b_r, b_c,from_up)
        print('----')
        if (a_r, a_c) == (row - 1, column - 1):
            break

        # A 向 右走, 之後 向下走
        a_r = a_r + 1 if a_c == column - 1 else a_r
        a_c = a_c if a_c == column - 1 else a_c + 1

        # B 向下走,之後 向右走
        b_c = b_c + 1 if b_r == row - 1 else b_c
        b_r = b_r if b_r == row - 1 else b_r + 1

        A = (a_r, a_c)
        B = (b_r, b_c)

        from_up = not from_up

        # print(f"A:{A},B:{B}")

    # print_line()
    print()


def print_matrix_zig_zag(matrix):
    # A 點
    a_r, a_c = 0, 0

    # B 點
    b_r, b_c = 0, 0

    row, column = matrix.shape
    print(f"row:{row},column:{column}")
    up = True
    while True:
        print('----')
        print_line(matrix, a_r, a_c, b_r, b_c, reverse=up)
        # 走到了 最後一個位置 , 退出條件
        if (a_r, a_c) == (row - 1, column - 1):
            break

        # A 向右走, 之後向下走
        a_r = a_r + 1 if a_c == column - 1 else a_r
        a_c = a_c if a_c == column - 1 else a_c + 1

        # B 向下走,之後 向右走
        b_c = b_c + 1 if b_r == row - 1 else b_c
        b_r = b_r if b_r == row - 1 else b_r + 1

        up = not up


def test_print_matrix_zig(matrix):
    # A 點
    a_r, a_c = 0, 0

    # B 點
    b_r, b_c = 0, 0

    row, column = matrix.shape

    #  矩形對應的 index 下標
    row_index = row - 1
    column_index = column - 1

    while True:
        print('-------------')

        # A 向 右走, 之後 向下走
        a_r = a_r + 1 if a_c == column_index else a_r
        a_c = a_c if a_c == column_index else a_c + 1

        # B 向下走,之後 向右走
        b_c = b_c + 1 if b_r == row_index else b_c
        b_r = b_r if b_r == row_index else b_r + 1

        A = (a_r, a_c)
        B = (b_r, b_c)

        print(f"A:{A},B:{B}")
        if A == B:
            print('A==B  break')
            break


def test_line():
    matrix = np.arange(0, 24).reshape((4, 6))

    print_line(matrix, 0, 3, 3, 0, reverse=True)

    print()
    print_line(matrix, 0, 3, 3, 0, reverse=False)

    print(f"\nmatrix:\n{matrix}")


if __name__ == '__main__':
    matrix = np.arange(0, 24).reshape((4, 6))

    print_matrix_zig_zag(matrix)

    print(f"\nmatrix:\n{matrix}")
    pass

result如下:

row:4,column:6
----
0 ----
6 1 ----
2 7 12 ----
18 13 8 3 ----
4 9 14 19 ----
20 15 10 5 ----
11 16 21 ----
22 17 ----
23 
matrix:
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

總結

這個題目還是對程式設計思想有一定考察,要從 列印 矩陣中 找到規律, 然後就比較好下手了.

分享快樂,留住感動. 2019-01-05 12:44:01 --frank