算法程序员python

Python 解螺旋数组

2017-07-12  本文已影响160人  zaijianbali

最近闲的时候看python,想想看了几天,也需要实践一下;
以下是摘自微信公众号
Crossin的编程教室

【每周一坑】罗马数组转换

N 为 4 的螺旋数组如图所示:

螺旋数组

输入一个正整数 N,输出以 N 为边长的螺旋矩阵。(比如上图就是 N 为 4 的结果)

其实所有的方案都是直接摘抄下来的,算是写的第一个python程序吧。

#coding=UTF-8

#解决python end = ‘ ’ 在2.x上的兼容问题
from __future__ import print_function
class Spiral:
    def __init__(self, N):
        #构造一个二维数组
        self.matrix = [[None for i in range(N)] for j in range(N)]
        #起始位置
        self.row = 0
        self.col = 0
        #数组的边界值
        self.max_row = N
        #更换方向标记
        self.mark = 0

    #获取数组的运动方向
    def direction(self, mark):
        around = [
                  [self.row, self.col+1],   #向右
                  [self.row+1, self.col],   #向下
                  [self.row, self.col-1],   #向左
                  [self.row-1, self.col]    #向上
            ]
        return around[mark%4]

#根据当前位置,获取下一个位置
# 如果是边界更换方向
# 如果下一个元素已经有了同样也要更换方向
    def next(self):
        #获取下一个位置
        i = self.direction(mark=self.mark)
        #判断是不是赋值和越界,如果没有,赋值螺旋数组上的数组位置值
        if -1 not in i and self.max_row not in i:
            if self.matrix[i[0]][i[1]] is None:
                #赋值self.row = i[0],self.col = i[1]
               self.row,self.col = i
               return None
        #更换方向
        self.mark +=1
        return self.next()

    def solution(self):
        for i in range(1,self.max_row**2+1):
            #行列赋值
            self.matrix[self.row][self.col] = i
            #结束
            if i == self.max_row**2:
                break
            self.next()
        #打印结果
        for r in self.matrix:
            for c in r:
                print('{0:^{1}}'.format(c,4),end = ' ')
            print('\n')

    def solution2(self):
        n = self.max_row;
        #对二维数组赋值
        a = [[0 for i in range(1, n+1)] for j in range(1,n+1)]
        x, y, i, j = 0, 0, 0, 0
        while a[i][j] == 0:
            y += 1
            a[i][j] = y
            #方向:right,可以向右移动(j< n-1) 并且 右侧的一个位置没有赋值( a[i][j+1] == 0)
            #是第一行或者(不是第一行但上一行已经有值了)
            if j < n-1 and a[i][j+1] == 0 and (i == 0 or i > 0 and a[i-1][j] != 0):
                j += 1
            #方向:down,可以向下移动(i < n-1)并且 下侧的位置没有赋值(a[i+1][j] == 0)
            elif i < n-1 and a[i+1][j] == 0:
                i += 1
             #方向:left,可以向左移动(j > 0)并且 左侧的位置没有赋值(a[i][j-1] == 0)
            elif j > 0 and a[i][j-1] == 0:
                j -= 1
             #方向:up,可以向上移动(i > 0)并且 左侧的位置没有赋值(a[i-1][j] == 0)
            elif i > 0 and a[i-1][j] == 0:
                i -= 1
        #打印
        for b in a:
            for c in b:
                print('{0:^{1}}'.format(c, 4), end = ' ')
            print('\n')

if __name__ == '__main__':
    n = int(input(' 输入螺旋数组最大行数 \n >>> '))
    s = Spiral(n)
    #方案1
    #s.solution()
     #方案2
    s.solution2()
            
上一篇下一篇

猜你喜欢

热点阅读