【基础入门题071】螺旋矩阵

简介: 【基础入门题071】螺旋矩阵

【基础入门题】2022.01.06

创建一个m行n列的矩阵,将整数1至m*n从左上角分别以顺时针、逆时针方向螺旋填入矩阵。

如: m,n = 4,6,输出:


   顺时针排列:

      1   2   3   4   5   6

    16 17 18 19 20  7

    15 24 23 22 21  8

    14 13 12 11 10  9


   逆时针排列:

     1 16 15 14 13 12

     2 17 24 23 22 11

     3 18 19 20 21 10

     4   5   6   7   8   9


编程语言:包括但不限于Python

题目来源:派森特给站每日刷题频道    


输出时用了2种不同方法:



m,n = map(int, input('请输入矩阵的行和列(用空格隔开):').split())
print('\n顺时针排列:')
Array = [[0 for _ in range(n)] for _ in range(m)]
Array[0][0] = 1
i,j,k = 0,0,1
while k<m*n:
    while j+1<n and not Array[i][j+1]:
        j += 1
        k += 1
        Array[i][j] = k
    while i+1<m and not Array[i+1][j]:
        i += 1
        k += 1
        Array[i][j] = k
    while j and not Array[i][j-1]:
        j -= 1
        k += 1
        Array[i][j] = k
    while i and not Array[i-1][j]:
        i -= 1
        k += 1
        Array[i][j] = k
w = len(str(m*n))+1
for a in Array:
    for b in a:
        print(str(b).rjust(w), end='')
    print()
print('\n逆时针排列:')
Array = [[0 for _ in range(n)] for _ in range(m)]
Array[0][0] = 1
i,j,k = 0,0,1
while k<m*n:
    while i+1<m and not Array[i+1][j]:
        i += 1
        k += 1
        Array[i][j] = k
    while j+1<n and not Array[i][j+1]:
        j += 1
        k += 1
        Array[i][j] = k
    while i and not Array[i-1][j]:
        i -= 1
        k += 1
        Array[i][j] = k
    while j and not Array[i][j-1]:
        j -= 1
        k += 1
        Array[i][j] = k
#w = len(str(m*n))+1
for a in Array:
    for b in a:
        print(f'{b:>{w}}', end='')
    print()



C语言代码:

#include<stdio.h>  
int main()
{  
    int m,n,x=0,y=0,c=1;
    scanf("%d %d",&m,&n); 
    int a[m+1][n+1]={0},b[m+1][n+1]={0};
    a[0][0]=1;b[0][0]=1;
    printf("顺时针排列:\n");
  while(c!=m*n){   
    while(y+1<n&&!a[x][y+1]) a[x][++y]=++c;
    while(x+1<m&&!a[x+1][y]) a[++x][y]=++c;
    while(y&&!a[x][y-1]) a[x][--y]=++c;
    while(x&&!a[x-1][y]) a[--x][y]=++c; 
  }
  for(x=0;x<m;x++){
    for(y=0;y<n;y++)
        printf("%3d", a[x][y]);
      printf("\n");
  }
    x=0;y=0;c=1;
    printf("逆时针排列:\n");
  while(c!=m*n){
    while(x+1<m&&!b[x+1][y]) b[++x][y]=++c;
    while(y+1<n&&!b[x][y+1]) b[x][++y]=++c;
    while(x&&!b[x-1][y]) b[--x][y]=++c; 
    while(y&&!b[x][y-1]) b[x][--y]=++c;
  }
  for(x=0;x<m;x++){
    for(y=0;y<n;y++)
        printf("%3d", b[x][y]);
      printf("\n");
  }
}
目录
相关文章
|
3月前
|
存储 Python
【Leetcode刷题Python】64. 最小路径和
一种使用动态规划解决LeetCode上64题“最小路径和”的Python实现方法,通过维护一个一维数组来计算从网格左上角到右下角的最小路径总和。
32 1
【Leetcode刷题Python】64. 最小路径和
|
算法
【AcWing刷题】蓝桥杯专题突破-动态规划-dp入门(17)
【AcWing刷题】蓝桥杯专题突破-动态规划-dp入门(17)
113 0
|
机器学习/深度学习 存储 算法
代码随想录训练营day48| 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
代码随想录训练营day48| 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
|
机器学习/深度学习 存储 人工智能
代码随想录训练营day29| 491.递增子序列 46.全排列 47.全排列 II
代码随想录训练营day29| 491.递增子序列 46.全排列 47.全排列 II
|
存储 算法 C++
【每日算法Day 81】面试经典题:关于丑数,你真的理解为什么这么算吗?
【每日算法Day 81】面试经典题:关于丑数,你真的理解为什么这么算吗?
|
Python
【基础入门题044】最小公倍数
【基础入门题044】最小公倍数
95 0
|
Python
【基础入门题030】《孙子算经》之鸡兔同笼
【基础入门题030】《孙子算经》之鸡兔同笼
117 0
|
Python
【基础入门题043】最大公约数
【基础入门题043】最大公约数
74 0
|
Python
【基础入门题026】佩尔数列Pell(n)
【基础入门题026】佩尔数列Pell(n)
108 0