【算法题】螺旋矩阵I (求解n阶螺旋矩阵问题)

一、问题的提出

螺旋矩阵是一种常见的矩阵形式,它的特点是按照螺旋的方式排列元素。n阶螺旋矩阵是指矩阵的大小为n×n,其中n为正整数。

 二、解决的思路

当N=1时,矩阵为\left ( 1 \right );

当N=2时,矩阵为\begin{pmatrix} 1&2\\ 4&3 \end{pmatrix};

当N>2(N为偶数如N=4)时,矩阵为\begin{pmatrix} 1&2&3&4\\ 12&13&14&5\\ 11&16&15&6\\ 10&9&8&7 \end{pmatrix};


当N>2(N为奇数如N=5)时,矩阵为\begin{pmatrix} 1&2&3&4&5\\ 16&17&18&19&6\\ 15&24&25&20&7\\ 14&23&22&21&8\\ 13&12&11&10&9 \end{pmatrix}

图1 螺旋矩阵分析图

三、递推法解题

从上思路分析和图1可知,当N>2时可分为k(k=N//2)个四边形的螺旋框,每边长为框长度(n)-1(即n-1),只是左上角的起始值和边框长度不同而已。如N为奇数,则正中心还有一个终值N²。

因此可用用递推来计算。

程序代码如下:

N = 5
def prt(b):                           # 打印二维列表
    for i in range(N):
        for j in range(N):
            print("%3d" % b[i][j], end='')
        print()

def Helix_Matrix(N):
    matrix = []                       # 初始化二维矩阵matrix(二维列表)
    for i in range(N):
        matrix.append([])
        for j in range(N):
            matrix[i].append(0)
    matrix[N//2][N//2] = N*N          # 若N为奇数时,正中间为N²
    cnt = 0
    n = N
    for k in range(N//2):
        for j in range(n-1):          # 矩形上边,从左向右
            cnt += 1
            matrix[k][k+j] = cnt
        for i in range(n-1):          # 矩形右边,从上往下
            cnt += 1
            matrix[k+i][k+n-1] = cnt
        for j in range(n-1):          # 矩形下边,从右向左
            cnt += 1
            matrix[k+n-1][k+n-1-j] = cnt
        for i in range(n-1):          # 矩形左边,从下往上
            cnt += 1
            matrix[k+n-1-i][k] = cnt
        n -= 2                        # 缩小规模时,矩形边长减2
    return matrix

hm = Helix_Matrix(N)
prt(hm)

执行结果:

12345
161718196
152425207
142322218
131211109

回到开头的题目,则

def Helix_Matrix(N):
    matrix = []                    # 初始化二维矩阵matrix(二维列表)
    for i in range(N):
        matrix.append([])
        for j in range(N):
            matrix[i].append(0)
    matrix[N//2][N//2] = N*N       # 若N为奇数时,正中间为N²
    cnt = 0
    n = N
    for k in range(N//2):
        for j in range(n-1):       # 矩形上边,从左向右
            cnt += 1
            matrix[k][k+j] = cnt
        for i in range(n-1):       # 矩形右边,从上往下
            cnt += 1
            matrix[k+i][k+n-1] = cnt
        for j in range(n-1):       # 矩形下边,从右向左
            cnt += 1
            matrix[k+n-1][k+n-1-j] = cnt
        for i in range(n-1):       # 矩形左边,从下往上
            cnt += 1
            matrix[k+n-1-i][k] = cnt
        n -= 2                     # 缩小规模时,矩形边长减2
    return matrix

n, i, j = map(int,input().split())
hm = Helix_Matrix(n)
print(hm[i-1][j-1])

输入4 2 3,输出为14。

四、递归法解题

当规模为1时直接填写(1个元素),见“二、解决的思路,结束递归;

当规模为2时直接填写(4个元素),见“二、解决的思路,结束递归;

当规模大于2时直接先写本圈(k)四边,见“二、解决的思路,再缩小规模递归调用。

这就是递归计算算法。

程序代码如下:

N = 6
def prt(b):                           # 打印二维列表
    for i in range(N):
        for j in range(N):
            print("%3d" % b[i][j], end='')
        print()

def Helix_Matrix(n,k,cnt):
    if n == 1:                        # 规模为1
        matrix[k][k] = cnt
    elif n == 2:                      # 规模为2
        matrix[k][k] = cnt
        cnt += 1
        matrix[k][k+1] = cnt
        cnt += 1
        matrix[k+1][k+1] = cnt
        cnt += 1
        matrix[k+1][k] = cnt
    else:                             # 规模大于2
        for j in range(n-1):          # 矩形上边,由左向右
            matrix[k][k+j] = cnt
            cnt += 1
        for i in range(n-1):          # 矩形右边,由上往下
            matrix[k+i][k+n-1] = cnt
            cnt += 1
        for j in range(n-1):          # 矩形下边,由右向左
            matrix[k+n-1][k+n-1-j] = cnt
            cnt += 1
        for i in range(n-1):          # 矩形左边,由下往上
            matrix[k+n-1-i][k] = cnt
            cnt += 1
        Helix_Matrix(n-2, k + 1, cnt) # 递归,缩小螺旋矩阵规模

matrix = []                           # 初始化二维矩阵matrix(二维列表)
for i in range(N):
    matrix.append([])
    for j in range(N):
        matrix[i].append(0)
Helix_Matrix(N,0,1)                   # 初始n=N, k=0, cnt=1
prt(matrix)

执行结果:

123456
20212223247
19323334258
18313635269
173029282710
161514131211

 回到开头的题目,则

def Helix_Matrix(n,k,cnt):
    if n == 1:                       # 规模为1
        matrix[k][k] = cnt
    elif n == 2:                     # 规模为2
        matrix[k][k] = cnt
        cnt += 1
        matrix[k][k+1] = cnt
        cnt += 1
        matrix[k+1][k+1] = cnt
        cnt += 1
        matrix[k+1][k] = cnt
    else:                             # 规模大于2
        for j in range(n-1):          # 矩形上边,由左向右
            matrix[k][k+j] = cnt
            cnt += 1
        for i in range(n-1):          # 矩形右边,由上往下
            matrix[k+i][k+n-1] = cnt
            cnt += 1
        for j in range(n-1):          # 矩形下边,由右向左
            matrix[k+n-1][k+n-1-j] = cnt
            cnt += 1
        for i in range(n-1):          # 矩形左边,由下往上
            matrix[k+n-1-i][k] = cnt
            cnt += 1
        Helix_Matrix(n-2, k + 1, cnt) # 递归,缩小螺旋矩阵规模

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_Matrix(N,0,1)                   # 初始n=N, k=0, cnt=1
print(matrix[x-1][y-1])

输入4 2 3,输出为14。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/70682.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Arduino ESP32 v2 使用记录:开发环境搭建

文章目录 目的开发环境搭建程序下载测试使用VS Code进行开发批量烧录固件到模块中总结 目的 在之前的文章 《使用Arduino开发ESP32(01):开发环境搭建》 中介绍了使用Arduino开发ESP32的开发环境搭建内容,只不过当时的 Arduino co…

Django进阶

1.orm 1.1 基本操作 orm,关系对象映射。 类 --> SQL --> 表 对象 --> SQL --> 数据特点:开发效率高、执行效率低( 程序写的垃圾SQL )。 编写ORM操作的步骤: settings.py,连…

Metasploitable2靶机漏洞复现

一、信息收集 nmap扫描靶机信息 二、弱口令 1.系统弱口令 在Kali Linux中使用telnet远程连接靶机 输入账号密码msfadmin即可登录 2.MySQL弱口令 使用mysql -h 靶机IP地址即可连接 3.PostgreSQL弱密码登录 输入psql -h 192.168.110.134 -U postgres 密码为postgres 输入\…

线性代数(二) 矩阵及其运算

前言 行列式det(A) 其实表示的只是一个值 ∣ a b c d ∣ a d − b c \begin{vmatrix} a & b\\ c & d\end{vmatrix} ad -bc ​ac​bd​ ​ad−bc,其基本变化是基于这个值是不变。而矩阵表示的是一个数表。 定义 矩阵与线性变换的关系 即得 ( a 11 a 12…

数据结构——单链表的实现(c语言版)

前言 单链表作为顺序表的一种,了解并且熟悉它的结构对于我们学习更加复杂的数据结构是有一定意义的。虽然单链表有一定的缺陷,但是单链表也有它存在的价值, 它也是作为其他数据结构的一部分出现的,比如在图,哈希表中。…

java之junit Test

JUnit测试简介 1.什么是单元测试 单元测试是针对最小的功能单元编写测试代码Java程序最小的功能单元是方法单元测试就是针对单个Java方法的测试 2.测试驱动开发 3.单元测试的好处 确保单个方法运行正常如果修改了方法代码,只需确保其对应的单元测试通过测试代码…

【深度学习】【风格迁移】Visual Concept Translator,一般图像到图像的翻译与一次性图像引导,论文

General Image-to-Image Translation with One-Shot Image Guidance 论文:https://arxiv.org/abs/2307.14352 代码:https://github.com/crystalneuro/visual-concept-translator 文章目录 Abstract1. Introduction2. 相关工作2.1 图像到图像转换2.2. Di…

使用chatGPT生成提示词,在文心一言生成装修概念图

介绍 家是情感的港湾,而家居装修则是将情感融入空间的艺术。如何在有限的空间里展现个性与美感,成为了现代人关注的焦点。而今,随着人工智能的发展,我们发现了一个新的创意助手——ChatGPT,它不仅为我们带来了更多可能…

nodejs+vue+elementui招聘求职网站系统的设计与实现-173lo

(1)管理员的功能是最高的,可以对系统所在功能进行查看,修改和删除,包括企业和用户功能。管理员用例如下: 图3-1管理员用例图 (2)企业关键功能包含个人中心、岗位类型管理、招聘信息…

C语言每日一题:16:数对。

思路一&#xff1a;基本思路 1.x,y均不大于n&#xff0c;就是小于等于n。 2.x%y大于等于k。 3.一般的思路使用双for循环去遍历每一对数。 代码实现&#xff1a; #include <stdio.h> int main() {int n 0;int k 0;//输入scanf("%d%d", &n, &k);int x…

【深度学习注意力机制系列】—— ECANet注意力机制(附pytorch实现)

ECANet&#xff08;Efficient Channel Attention Network&#xff09;是一种用于图像处理任务的神经网络架构&#xff0c;它在保持高效性的同时&#xff0c;有效地捕捉图像中的通道间关系&#xff0c;从而提升了特征表示的能力。ECANet通过引入通道注意力机制&#xff0c;以及在…

【Plex】FRP内网穿透后 App无法使用问题

能搜索到这个文章的&#xff0c;应该都看过这位同学的分析【Plex】FRP内网穿透后 App无法使用问题_plex frp无效_Fu1co的博客-CSDN博客 这个是必要的过程&#xff0c;但是设置之后仍然app端无法访问&#xff0c;原因是因为网络端口的问题 这个里面的这个公开端口&#xff0c;可…

STM32 F103C8T6学习笔记1:开发环境与原理图的熟悉

作为一名大学生&#xff0c;学习单片机有一段时间了&#xff0c;也接触过嵌入式ARM的开发&#xff0c;但从未使用以及接触过STM32C8T6大开发使用&#xff0c;于是从今日开始&#xff0c;将学习使用它~ 本文介绍STM32C8T6最小系统开发环境搭建注意问题&#xff0c;STM32C8T6单片…

WPF上位机9——Lambda和Linq

Lambda Linq 操作集合 使用类sql形式查询 Linq To SQL

微服务学习笔记-基本概念

微服务是一种经过良好架构设计的分布式架构方案。根据业务功能对系统做拆分&#xff0c;每个业务功能模块作为独立项目开发&#xff0c;称为一个服务。 微服务的架构特征&#xff1a; 单一职责&#xff1a;微服务拆分粒度更小&#xff0c;每一个服务都对应唯一的业务能力&…

Vue实现详细界面里面有一个列表

目录 Vue实现详细界面里面有一个列表 理一下思路&#xff1a; 效果如下&#xff1a; 1、 主页面正常写 2、详细界面(重点) 3、详细界面里面的列表(重点) 要点&#xff1a; Vue实现详细界面里面有一个列表 理一下思路&#xff1a; 1、首先需要这条数据的主键id&#xff…

SpringSpringBoot常用注解

目录 一、核心注解二、Spring Bean 相关2.1 Autowired2.2 Component, Repository, Service, Controller2.3 RestController 与 Controller2.4 Configuration 与 Component2.5 Scope 三、处理常见的 HTTP 请求类型3.1 GET 请求3.2 POST 请求3.3 PUT 请求3.4 DELETE 请求3.5 PATC…

【Python】背景及环境搭建

文章目录 了解计算机一、Python背景知识一、Python环境搭建 努力经营当下 直至未来明朗 了解计算机 示例&#xff1a;使用电脑访问B站 1&#xff09; 本地的计算机会给B站服务器发送一个网络请求&#xff08;如&#xff1a;谁&#xff0c;想看哪个视频&#xff09; 2&#xf…

MySQL8安装教程 保姆级(Windows))

下载 官网: mysql官网点击Downloads->MySQL Community(GPL) Downloads->MySQL Community Server(或者点击MySQL installer for Windows) Windows下有两种安装方式 在线安装 一般带有 web字样 这个需要联网离线安装 一般没有web字样 安装 下载好之后,版本号可以不一样&…

《系统架构设计师教程》重点章节思维导图

内容来自《系统架构设计师教程》&#xff0c;筛选系统架构设计师考试中分值重点分布的章节&#xff0c;根据章节的内容整理出相关思维导图。 重点章节 第2章&#xff1a;计算机系统知识第5章&#xff1a;软件工程基础知识第7章&#xff1a;系统架构设计基础知识第8章&#xff1…