'''
10、打印矩阵外圈
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
打印顺序为1,2,6,7,13,14,16,15,11,10,4,3
挑战题:
打印矩阵元素
1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25
之字形打印结果为1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
'''
lst = [[1,2,6,7,15],
[3,5,8,14,16],
[4,9,13,17,22],
[10,12,18,21,23],
[11,19,20,24,25]]
#打印外圈,方阵,索引有对称规律,长度确定,打印一半即可
line = [0]*(2*len(lst[0]) + 2 * (len(lst)-2))
line[0] = lst[0][0] ##line[index] :00 01 02 03 13 23 33 32 31 30 20 10
index = 1
for i in range(len(lst)):
for j in range(1,len(lst[0])):
if i == 0:
line[index] = lst[i][j]
line[-index] = lst[j][i]
index += 1
elif j == len(lst[0])-1:
line[index] = lst[i][j]
line[-index] = lst[j][i]
index += 1
print('口:',line)
##之字,规律好找,没效率!!!
zline = []
row = len(lst)
cont = 0
for i in range(2*row-1):
if not i & 1:
for j in range(row-1,-1,-1):
for k in range(row):
cont += 1
if j + k == i:
zline.append(lst[j][k])
else:
for j in range(row):
for k in range(row-1,-1,-1):
cont += 1
if j + k == i:
zline.append(lst[j][k])
print(zline,cont)
##之字,边间不好找,效率高,非方阵不适用
zline = []
cont = 0
for i in range(2*row-1): #00 01 10 20 11 02 03 12 21 30 31 22 13 23 32 33
if i < row :
for j in range(i+1):
cont += 1
if not i & 1:
zline.append(lst[i-j][j])
else:
zline.append(lst[j][i-j])
else:
for j in range(i-row+1,row):
cont += 1
if not i & 1:
zline.append(lst[i-j][j])
else:
zline.append(lst[j][i-j])
print('之:',zline,cont)
##之字,将数组变成另一数组,通过索引,先拿到数据,再按不同方向输出,适用与非方阵
lst = [[1,2,6,7],
[3,5,8,14],
[4,9,13,17],
[10,12,18,21],
[11,19,20,24]]
zline1 = [ [] for i in range((len(lst)+len(lst[0])-1))]
index = 0
for i in range(len(lst)):
for j in range(len(lst[0])):
zline1[index].append(lst[i][j])
index += 1
if j == len(lst[0])-1:
index = i + 1
print(zline1)
for i,row in enumerate(zline1):
if not i&1:
print(' '.join(map(str,reversed(row))),end = ' ')
else:
print(' '.join(map(str,row)),end = ' ')
#回字打印,函数每一次收集外圈(控制索引实现),把里面的矩阵(矩阵切片用zip)递归调用函数,数据存在默认值中, 完全没效率, 就当玩玩,
def mouth(lst,nums = []):
if lst == []: return nums
if len(lst) == 1 and len(lst[0]) == 1: return nums + [lst[0][0]]
i = 0
stepi = 0
j = 0
stepj = 0
flag,flag1,flag2 = False,False,False
for k in range(2*len(lst)+2*len(lst[0])-4):
nums.append(lst[i][j])
if i == 0:
stepi = 0
stepj = 1
if j == len(lst[0])-1: flag = True
if flag:
stepi = 1
stepj = 0
if i == len(lst)-1:
flag1 = True
flag = False
if flag1:
stepi = 0
stepj = -1
if j == 0:
flag2 = True
flag1 = False
if flag2:
stepi = -1
stepj = 0
i += stepi
j += stepj
return mouth(list(zip(*list(zip(*lst[1:len(lst)-1]))[1:len(lst[0])-1])),nums)
# 去掉矩阵外面一层, 可能不太好阅读, 效率也有问题, 用Numpy库, 效率好点
lst = [[1, 2, 3, 4, 5],
[16,17,18,19, 6],
[15,24,25,20, 7],
[14,23,22,21, 8],
[13,12,11,10, 9]]
lst1 = [[1,2,3,4],
[12,13,14,5],
[11,16,15,6],
[10,9,8,7]]
print(mouth(lst))
回字打印完全没效率, 就当玩玩