目录
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
特例:方阵
以方阵为特例找规律如下:
按照下右上左的顺序写循环,需要注意的是for循环结束的位置要比矩阵中结束的位置多减1,向上和向左是反方向要在range内加上-1。
下面就需要用到哲学的方法论啦!具体情况具体分析!
行大于列
列大于行
代码实现:
# First创建一个矩阵
n, m = map(int, input().split())
a = [list(map(int, input().split())) for i in range(n)]
b = [] # 一个空列表存取到的数
import math # 用来计算圈数
c = math.ceil(min(m,n)/ 2) # math.ceil这个函数的意思是向上取整,向下取整直接整除就可以
for i in range(c): # 大循环为圈数
for x in range(i, n - i): # 方向向下输出
b.append(a[x][i])
for y in range(i + 1, m - i): # 方向向右输出
if i == c - 1:
if n > m and m % 2 != 0:
break
b.append(a[n - 1 - i][y])
for x in range(n - 2 - i, i - 1, -1): # 方向向上输出
if i == c - 1:
if (n > m and m % 2 != 0) or (m > n and n % 2 != 0):
break
b.append(a[x][m - 1 - i])
for y in range(m - 2 - i, i, -1): # 方向向左输出
if i == c - 1:
if (n > m) or (m > n and n % 2 != 0):
break
b.append(a[i][y])
print(*b) # 这一行代码省去了for循环遍历输出