工信部蓝桥杯Python取回形取数答案

工信部蓝桥杯Python取回形取数答案

"""
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。
一开始位于矩阵左上角,方向向下。

"""
# 输入行数与列数,
# map对序列中的每个数据取整,返回map对象,再用list转换成列表
row,col=list(map(int,input().split(',')))

# 形成数据矩形,二维嵌套列表
data_list=[]
c = 1
for x in range(row):
    nest = []
    for y in range(col):
        nest.append(c)
        c  = c + 1
    data_list.append(nest)
    
begin_r = row                # 开始行
begin_c = col                # 开始列

rounds=0                     # 表示圈
answers=[]                   # 结果列表

def get_one_round(begin_r,begin_c,rounds):
    """递归函数,获取一圈数据,从左上往下逆时针旋转。"""
    for r in range(rounds,begin_r):  # 列固定,行变化      
        answers.append(data_list[r][0+rounds])
        
    for c in range(1+rounds,begin_c): # 行固定,列变化        
        answers.append(data_list[begin_r-1][c])
        
    for r in range(begin_r-2,rounds-1,-1):
        # 开始的列要大于rounds才添加到列表中,防止重复添加数据
        if begin_c > rounds:answers.append(data_list[r][begin_c-1])
        
    for c in range(begin_c-2,rounds,-1):
        if begin_r > rounds: answers.append(data_list[rounds][c])
        
    rounds+=1
    if(rounds>=begin_r-1 or rounds>=begin_c-1): return
    # 接下来获取更小的一圈的数据
    get_one_round(begin_r-1,begin_c-1,rounds)
    
get_one_round(begin_r,begin_c,rounds)

for i in range(len(answers)):
    print(answers[i], end=' ' if i != len(answers)-1 else '')

    
    

李兴球

李兴球的博客是Python创意编程原创博客