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

一、问题的提出

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≤in)、j(1≤jn),每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。

输出格式

输出到标准输出。一个整数,表示相应矩阵中第 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 蛇形矩阵分析图

三、矩阵生成算法

nn列,第一行为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])

执行结果:

 

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

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

相关文章

hive-无法启动hiveserver2

启动hiveserver2没有反应&#xff0c;客户端也无法连接( beeline -u jdbc:hive2://node01:10000 -n root) 报错如下 查看hive的Log日志&#xff0c;发现如下报错 如何解决 在hive的hive_site.xml中添加如下代码 <property><name>hive.server2.active.passive…

UDS (Unified Diagnostic Services)汽车诊断标准协议

作者博客主页 作者 : Eterlove 一笔一画&#xff0c;记录我的学习生活&#xff01;站在巨人的肩上Standing on Shoulders of Giants! 该文章为原创&#xff0c;转载请注明出处和作者 参考文献&#xff1a; 《道路车辆统一诊断服务(UDS) Road vehicles - Unified diagnostic s…

__ob__: Observer 后缀的数组的取值方式

开发中&#xff0c;经常从接口、父组件中&#xff0c;拿到数组然后给新的数组使用&#xff0c; 但是&#xff0c;有时候会发现带有 __ob__: Observer 后缀的数组&#xff0c;对这种数组来说&#xff0c;你是无法取到这个数组的值的&#xff0c; 而且&#xff0c;离谱的是consol…

【Rust】Rust学习 第十章泛型、trait 和生命周期

泛型是具体类型或其他属性的抽象替代。我们可以表达泛型的属性&#xff0c;比如他们的行为或如何与其他泛型相关联&#xff0c;而不需要在编写和编译代码时知道他们在这里实际上代表什么。 之后&#xff0c;我们讨论 trait&#xff0c;这是一个定义泛型行为的方法。trait 可以…

MAC环境,在IDEA执行报错java: -source 1.5 中不支持 diamond 运算符

Error:(41, 51) java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符) 进入设置 修改java版本 pom文件中加入 <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin&l…

matlab使用教程(16)—图论中图的定义与修改

1.修改现有图的节点和边 此示例演示如何使用 addedge 、 rmedge 、 addnode 、 rmnode 、 findedge 、 findnode 及 subgraph 函数访问和修改 graph 或 digraph 对象中的节点和/或边。 1.1 添加节点 创建一个包含四个节点和四条边的图。s 和 t 中的对应元素用于指定每条…

什么是前端框架?怎么学习? - 易智编译EaseEditing

前端框架是一种用于开发Web应用程序界面的工具集合&#xff0c;它提供了一系列预定义的代码和结构&#xff0c;以简化开发过程并提高效率。 前端框架通常包括HTML、CSS和JavaScript的库和工具&#xff0c;用于构建交互式、动态和响应式的用户界面。 学习前端框架可以让您更高效…

Android 组件

TextView 文本框 用于显示文本的一个控件。文本的字体尺寸单位为 sp 。sp: scaled pixels(放大像素). 主要用于字体显示。 文本常用属性 属性名说明id为TextView设置一个组件id&#xff0c;根据id&#xff0c;我们可以在Java代码中通过 findViewById()的方法获取到该对象&…

vue实现a组件中数据变化b组件实时更新(ab组件无关联)

需求&#xff1a;A组件新增、编辑或者删除数据时&#xff0c;B组件实时更新数据 // src/utils/bus.js// bus.$emit(bridge-updated) 是在事件总线实例 bus 上触发了一个自定义事件 // data-updated&#xff0c;相当于发布了一个事件。// bus.$on(bridge-update…

面试热题(合并K个升序链表)

给定一个链表数组&#xff0c;每个链表都已经按升序排列。 请将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数组如下&#xff1a; [1->4->5,1…

ssh做端口转发

问题 主机1能访问外网&#xff0c;主机2 不能访问外网外部主机想要访问主机2 解决 在主机1和主机2之间建隧道。 在主机1上做本地端口转发。可以用ssh来做本地端口转发(转发到远端)。 方法&#xff1a; 在&#xff08;本地&#xff09;主机1上执行 ssh -C -f -N -g -L 10.…

分类预测 | MATLAB实现GAPSO-BP遗传算法组合粒子群算法优化BP神经网络多输入分类预测

分类预测 | MATLAB实现GAPSO-BP遗传算法组合粒子群算法优化BP神经网络多输入分类预测 目录 分类预测 | MATLAB实现GAPSO-BP遗传算法组合粒子群算法优化BP神经网络多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.分类预测 | MATLAB实现GAPSO-BP遗…

HTTP--Request详解

请求消息数据格式 请求行 请求方式 请求url 请求协议/版本 GET /login.html HTTP/1.1 请求头 客户端浏览器告诉服务器一些信息 请求头名称: 请求头值 常见的请求头&#xff1a; User-Agent&#xff1a;浏览器告诉服务器&#xff0c;我访问你使用的浏览器版本信息 可…

视频云存储平台EasyCVR视频汇聚接入AI算法接口,如何在检测中对视频流画框?

视频集中存储EasyCVR安防监控视频汇聚平台基于云边端智能协同架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台可支持多协议接入&#xff0c;包括市场主流标准协议与厂家私有协议及SDK&#xff0c;如&#xff1a;国标GB28181、RTMP、RTSP/Onvif、海康Ehome…

C++面向对象编程

C面向对象编程 面向对象基础 实体&#xff08;属性&#xff0c;行为&#xff09; ADT(abstract data type) 面向对象语言的四大特征&#xff1a;抽象&#xff0c;封装&#xff08;隐藏&#xff09;&#xff0c;继承&#xff0c;多态。 访问限定符&#xff1a;public 共有的…

el-tree通过default-expand-all动态控制展开/折叠

1、如下图通过勾选框动态控制展开/折叠&#xff0c;全选/清空 2、实现方式如下&#xff1a;定义key&#xff0c;监听checked2修改treeKey&#xff0c;重新渲染tere&#xff1b;附加全选和清空。 <div class"tree"><el-checkbox v-model"checked1"…

一场大火烧毁了印度的芯片梦 | 百能云芯

谈起印度的半导体发展史&#xff0c;鲜为人知的是&#xff0c;该国曾有可能成为全球半导体制造业的重要中心。然而&#xff0c;一个意外的事件彻底改变了历史进程&#xff0c;让印度错失了超越台积电的机会。 01半导体制造潜力 在高科技行业&#xff0c;也许很多人都不看好印度…

数据结构-栈和队列

目录 栈的概念 栈的使用 ​编辑 模拟实现栈 中缀表达式转后缀表达式 括号匹配 出栈入栈次序匹配 队列概念 队列的使用 栈的概念 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作.进行数据插入和删除操作的一端称为栈顶,;另一端称为栈底.栈中的数据…

vue 获取设备指纹

import Fingerprint2 from fingerprintjs2 // async 异步请求 async getFingerprint () {return new Promise((resolve, reject) > {Fingerprint2.getV18({}, (result, components) > {resolve(result)})})}, // 获取用户sessionasync getSession () {/* 等待获取设备指纹…

微信小程序真机调试异常cmdId 1006, errCode-50011-已解决

cmdId 1006, errCode-50011 起因 小程序在模拟器上预览没问题,真机调试和体验版首页打不开,点展开显示cmdId 1006, errCode-50011 解决 查了下1006, 说是广告, 我没接广告,这个也不是错误码 1006广告组件被驳回你的广告正在被审核,无法展现广告后来找到几个类似的帖子…