【算法题】螺旋矩阵IV (求解n阶折线蛇形矩阵)

  • Post author:
  • Post category:其他





一、问题的提出






n



阶折线蛇形矩阵的特点是按照图1所示的方式排列元素。



n



阶蛇形矩阵是指矩阵的大小为



n



×



n



,其中



n



为正整数。


题目背景

一个

n



n

列的螺旋矩阵可由如图1所示的方法生成,观察图片,找出填数规律。填数规则为从 1 开始填到

n

×

n

图1 8行8列的螺旋矩阵

现在给出矩阵大小

n

以及

i



j

,请你求出该矩阵中第

i

行第

j

列的数是多少。



题目描述






输入格式


从标准输入读入数据。 共一行,包含三个整数

n

(1≤

n

≤1,000)、

i

(1≤

i



n

)、

j

(1≤

j



n

),每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。



输出格式


输出到标准输出。一个整数,表示相应矩阵中第

i

行第

j

列的数。



输入输出样例



输入


#1

复制



8 2 8


输出


#1

复制



51



说明/提示



子任务

对于 30% 的测试数据,

n

≤10;对于 60% 的测试数据,

n

≤100;对于 100% 的测试数据,

n

≤1,000;特别地,对于 20% 的测试数据,

i

=

j

=1。




二、解题的思路





由图2可知,这是个水平、垂直转弯的蛇形矩阵。仔细看图2发现:当在第1行(行号为0)时则向右(行号不变,列号加1)填数,然后向下,当行列值相等转向左侧,如是列号到0时则向下(行号加1),然后向右方填数,如行列值相等则转向上,如是行号到0时则向右(行号不变,列号加1),然后向下,如此重复直到最后行的0列,或最后列的0行为止。






图2 蛇形矩阵分析图




三、矩阵生成算法






n







n



列,第一行为


0


行,第一列为


0


列。从


(0, 0)





1


开始,方向设为向上。



当向上时,如行号已为


0


则列号加


1、


方向向反


(


向下


)


,否则行号减


1


,如列号为


n-1


且行号为


0


时结束填写。



当向下时,如列号


==


行号则转弯


(


向左


)


,否则行号加


1






当向左时,如列号已为


0


则行号加


1、


方向向反


(


向右


)


,否则列号减


1


,如行号为


n-1


且列号为


0


时结束填写。



当向右时,如行号=


=


列号则转弯


(


向上


)


,否则列号加


1





程序代码如下:

def prt(hm):                 # 打印二维列表
    for i in range(N):
        for j in range(N):
            print("%3d" % hm[i][j], end='')
        print()
 
def Helix_MatrixII(n):
    cnt = 1
    i = j = 0
    k = 1
    while True:
        matrix[i][j] = cnt
        if (i == 0 and j >= n-1 and k == 1) or (i >= n-1 and j == 0 and k == 3):
            break            # 向上填写时,最后1列并到0行 或 向左填写时,最后1行并到0列
        if k == 0:           # 向右填写
            j +=1
            if i == j:       # 转向向上
                k = 1
        elif k == 1:         # 向上填写
            if i == 0:       # 到0时,转下一列调头
                j += 1
                k = 2
            else:
                i -=1
        elif k == 2:         # 向下填写
            i +=1
            if i == j:       # 转向向左
                k = 3
        elif k == 3:         # 向左填写
            if j == 0:       # 到0时,转下一行调头
                i += 1
                k = 0
            else:
                j -=1
        cnt += 1
           
N = 6
matrix = []                  # 初始化二维矩阵matrix(二维列表)
for i in range(N):
    matrix.append([])
    for j in range(N):
        matrix[i].append(0)
Helix_MatrixII(N)
prt(matrix)



执行结果:







四、题目求解算法




题目要求输入矩阵规模n和坐标(i, j)三个参数,求出矩阵(i, j)处的元素值。所以先按n求出矩阵,现按坐标输出元素值。


程序代码如下:

def Helix_MatrixII(n):
    cnt = 1
    i = j = 0
    k = 1
    while True:
        matrix[i][j] = cnt
        if (i == 0 and j >= n-1 and k == 1) or (i >= n-1 and j == 0 and k == 3):
            break          # 向上并最后1列到第0行 或 向左并最后1行到第0列
        if k == 0:         # 向右填写
            j +=1
            if i == j:     # 转向向上
                k = 1
        elif k == 1:       # 向上填写
            if i == 0:     # 向上到0行,列号加1并转向下
                j += 1
                k = 2
            else:
                i -=1
        elif k == 2:       # 向下填写
            i +=1
            if i == j:     # 转向向左
                k = 3
        elif k == 3:       # 向左填写
            if j == 0:     # 向左到0列,行号加1并转向右
                i += 1
                k = 0
            else:
                j -=1
        cnt += 1
           
N, x, y = map(int, input().split())
matrix = []                # 初始化二维矩阵matrix(二维列表)
for i in range(N):
    matrix.append([])
    for j in range(N):
        matrix[i].append(0)
Helix_MatrixII(N)
print(matrix[x-1][y-1])



执行结果:










版权声明:本文为hz_zhangrl原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。