每日一算法(18)

每日算法篇-蓝桥练习篇

“有很多话其实都想说,默默的爱一个人真的好累,而且是爱而不得的人,人生真的好多意难平,成长的目的就是让你忘掉这些,磨平这些所谓的意难平。我可以光明正大的想你,却不能光明正大的找你,我可以光明正大的喜欢你,却不能光明正大的拥有你。耿耿最近走不出来了。”——努力成为程序员的耿耿(2021/11/9)

题目————回形取数问题

问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
样例输入
3 2
1 2
3 4
5 6
样例输出
1 3 5 6 4 2

m,n=map(int,input().split(" "))#输入两个行和列
m_n=[[]for i in range(m)]  #创建数组的时候一定要注意,多维数组的建立方法要学会...
count=row=col=0  #定义3和判断条件,总数,行,列
for i in range(m): #数组输入内容
    a=list(map(int,input().split()))
    for j in range(n):
        m_n[i].append(a[j])
while count<=m*n: #数量遍历完才能出来
    while(row<m and m_n[row][col]!=-1):#从上向下取数
        print(m_n[row][col],end=" ")
        m_n[row][col]=-1
        row+=1
        count+=1
    row-=1 #最后一次循环的时候不应该如果再加一就会导致超出index range
    col+=1 #从上到下最后旋转的时候,要从第二个开始进行遍历
    #下面循环超出界面的操作与这个一直,看懂从上到下以此类推
    while(col<n and m_n[row][col]!=-1):#从左向右取数
        print(m_n[row][col],end= " ")
        m_n[row][col] = -1
        col+=1
        count+=1
    col-=1
    row-=1
    while (row>=0 and m_n[row][col] != -1):  # 从下向上取数
        print(m_n[row][col], end=" ")
        m_n[row][col] = -1
        row -= 1
        count += 1
    row+=1
    col-=1
    while (col>=0 and m_n[row][col] != -1):  # 从右向左取数
        print(m_n[row][col], end=" ")
        m_n[row][col] = -1
        col -= 1
        count += 1
    col+=1
    row+=1

这道题其实有点难理解,就一定要想明白,不管用不用得上都要写4个方向的函数,才能就是说涵盖完所有情况,另外重点就是理清楚对于超出范围的调试那个点,这样就好了,我也不知道有没有简单的方法,欢迎私信我!
最近的题目都是出自蓝桥练习系统的,如果要考蓝桥的话,很适合你

你可能感兴趣的:(数据结构,算法)