列印之字矩陣
阿新 • • 發佈:2019-01-05
題目意思是這樣列印矩陣
分析一下
可以考慮 要這樣列印矩陣 要考慮 斜著列印,通過兩個點 來定義 一條斜線, 然後 列印這個 斜線 上的 所有點,就可以了. 下圖就是分析思路:
定義 A , B 兩點, 每個點都有自己的行動軌跡, A 向 右走, 走到 最右邊, 往下走.
B 先 向下走, 走到最後一行,開始向右走,
A 和B 最終 會相遇, 如果 A 和B 再次 相遇, 則 A 和B 已經把整個 矩陣 走完了.
圖片1
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 連線的一條線的 的值呢? 如圖所示
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]]
總結
這個題目還是對程式設計思想有一定考察,要從 列印 矩陣中 找到規律, 然後就比較好下手了.