螺旋矩阵生成——python实现

今天偶然看见了一个有意思的数列排序题,就尝试着比划了一下,确实挺有意思,蛮好玩的。特此记录下来

螺旋矩阵实现

python版本

一、概述

螺旋矩阵样例如下:

==============
  1   2   3   4   5   6 
 20  21  22  23  24   7 
 19  32  33  34  25   8 
 18  31  36  35  26   9 
 17  30  29  28  27  10 
 16  15  14  13  12  11 
==============

二、解法分析

拆分如上矩阵有:

# 6阶矩阵时
==============
  1   2   3   4   5   0 
  0  21  22  23   0   0 
  0   0  33   0   0   0 
  0   0   0   0   0   0 
  0   0   0   0   0   0 
  0   0   0   0   0   0 
==============
  0   0   0   0   0   6 
  0   0   0   0  24   7 
  0   0   0  34  25   8 
  0   0   0   0  26   9 
  0   0   0   0   0  10 
  0   0   0   0   0   0 
==============
  0   0   0   0   0   0 
  0   0   0   0   0   0 
  0   0   0   0   0   0 
  0   0   0  35   0   0 
  0   0  29  28  27   0 
  0  15  14  13  12  11 
==============
  0   0   0   0   0   0 
 20   0   0   0   0   0 
 19  32   0   0   0   0 
 18  31  36   0   0   0 
 17  30   0   0   0   0 
 16   0   0   0   0   0 
==============

如上三角的规律显而易见:

  1. 倒三角的个数为5、3、1
  2. 且四个方位的形状完全一致
  3. 倒三角起始个数为阶数-1

因此解题思路为:

  1. 填倒三角的值
  2. 矩阵左旋转90度,再填倒三角的值

三、实现细节

3.1 倒三角的计算:

设:上右下左,顺时针四个方位的倒三角顺位标号为1,2,3,4。预设阶数为De(Degree),则有如下分析:

倒三角的行数如下: Sn = {L1, L2, L3 ...; {LN = (De-1)-2n, n=0,1,2...}, LN > 0}
第1圈x顺位的起始位为:0 + (De-1)*(x-1)
第2圈x顺位的起始位为:4*(De-1) + (De-1-2)*(x-1)
...
由上规律可得:圈数由内往外从1开始以Dgx为数,由顺位标号为tx,取1,2,3,4。则有如下伪代码:
Res[De][De] = {
   0} //赋值矩阵坐标
Cylstart = 0 //默认第一圈外无值则此处为零,并从第一圈开始计算
step_N = De-1
while step_N >0 :
	start = Cylstart + L_n * (tx-1)	//当前圈按顺位偏移
    for(int bias = 0;bias < stepN;bias++)	//倒三角赋值
		Res[Dgx][Dgx+bias] = start+bias
	//完成一行赋值进行下一行圈偏移有
	Cylstart += step_N*4
	//从定位
	Dgx += 1 //坐标偏移至下一行
	step_N -= 2	//计算L_n-1
3.2 矩阵旋转

使用numpy的部分操作完成

import numpy as np


class FlipMatrix2D:
    @staticmethod
    def flip180(arr):
        new_arr = arr.reshape(arr.size)
        new_arr = new_arr[::-1]
        new_arr = new_arr.reshape(arr.shape)
        return new_arr
    @staticmethod
    def flip90_left(arr):
        new_arr = np.transpose(arr)
        new_arr = new_arr[::-1]
        
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值