【Python】蓝桥杯-基础练习-回形取数

 

目录

问题描述

特例:方阵

行大于列

列大于行

代码实现:


问题描述

  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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

 特例:方阵

利用Exel理解回形取数
利用excel找规律

以方阵为特例找规律如下:

 按照下右上左的顺序写循环,需要注意的是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循环遍历输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值