python 生成螺旋矩阵

 

对于任意 m*n 矩阵,将 1~m*n 的数字按照螺旋规则在矩阵中排列。

如 m=3,n=3,期望结果为:

[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]

以下代码支持方阵以及非方阵。

code:

# coding=utf-8
import numpy

flag=1
pos_x=0
pos_y=0
def inc(pos_x,pos_y,row,col):
    if(-1<pos_x<row and -1<pos_y<col):
        return True
    else:
        return False
def gen(row,col):
    global flag
    global pos_x
    global pos_y
    rowbox=[]
    for i in range(col):
        rowbox.append(0)
    data=[]
    for i in range(row):
        data.append(rowbox)
    x = numpy.array(data)
    for i in range(1,row*col+1):
        while(1):
            if(flag==1):
                if(inc(pos_x,pos_y,row,col) and x[pos_x][pos_y]==0):
                    x[pos_x][pos_y]=i
                    pos_y=pos_y+1
                    break
                else:
                    pos_y=pos_y-1
                    pos_x=pos_x+1
                    flag=2
            if(flag==2):
                if(inc(pos_x,pos_y,row,col) and x[pos_x][pos_y]==0):
                    x[pos_x][pos_y]=i
                    pos_x=pos_x+1
                    break
                else:
                    pos_x=pos_x-1
                    pos_y=pos_y-1
                    flag=3
            if(flag==3):
                if(inc(pos_x,pos_y,row,col) and x[pos_x][pos_y]==0):
                    x[pos_x][pos_y]=i
                    pos_y=pos_y-1
                    break
                else:
                    pos_y=pos_y+1
                    pos_x=pos_x-1
                    flag=4
            if(flag==4):
                if(inc(pos_x,pos_y,row,col) and x[pos_x][pos_y]==0):
                    x[pos_x][pos_y]=i
                    pos_x=pos_x-1
                    break
                else:
                    pos_y=pos_y+1
                    pos_x=pos_x+1
                    flag=1
    return x


# m*n Matrix
m=3
n=6
print(gen(m,n))

输出

[[ 1  2  3  4  5  6]
 [14 15 16 17 18  7]
 [13 12 11 10  9  8]]

 

转载于:https://www.cnblogs.com/sea-stream/p/10801367.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>