题目描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5
求解
D、R、U、L分别表示下、右、上、左四个移动方向
D方向移动:行标加1,如果行标超限或者此元素已被访问,切换到R方向并且行标减1,列标加1。
R方向移动:列标加1,如果列标超限或者此元素已被访问,切换到U方向并且列标减1,行标减1。
U方向移动:行标减1,如果行标小于0了或者此元素已被访问,切换到L方向并且行标加1,列标减1。
L方向移动:列标减1,如果列标小于0了或者此元素已被访问,切换到D方向并且列标加1,行标加1。
循环结束的条件:行标小于0(对应一行的情况),列标等于n(对应一列的情况或者一个元素的情况),此元素已被访问(对应其他情况)。
#蓝桥杯基础练习VIP-回形取数Python版
m,n=map(int,input().strip().split())
A=[list(map(int,input().split())) for _ in range(m)]
row,column=0,0
flag='D'
B=[]
while True:
if row<0 or column==n or A[row][column]==-1:
break
B.append(A[row][column])
A[row][column]=-1
if flag=='D':
row+=1
elif flag=='R':
column+=1
elif flag=='U':
row-=1
elif flag=='L':
column-=1
if flag=='D' and (row>=m or A[row][column]==-1):
flag='R'
row-=1
column+=1
elif flag=='R' and (column>=n or A[row][column]==-1):
flag='U'
column-=1
row-=1
elif flag=='U' and (row<0 or A[row][column]==-1):
flag='L'
row+=1
column-=1
elif flag=='L' and (column<0 or A[row][column]==-1):
flag='D'
column+=1
row+=1
for i in range(len(B)):
if i==len(B)-1:
print(B[i])
else:
print(B[i],end=' ')