2-蛇形矩阵

2023-11-03

蛇形矩阵

首先我们来看问题:
在这里插入图片描述
上面这个矩阵我们要怎么将它输出呢?
我们仔细观察这个矩阵,不难发现它是有一定规律的:它的数字沿着一条蛇一样弯曲排布:
在这里插入图片描述
那么问题来了,我们在电脑中输出都是以一行一行这样来输出的,这个矩阵的顺序明显不符合以行为参考时的输出方式,那我们就改个思路,既然不能按蛇形的顺序打印,但是我们可以按蛇形的顺序将数据存入一个数组呀,想到这里,我们就有一定方向了。
首先是写好用来存储的数组和打印函数:

#include<stdio.h>

int main()
{
    int arr[20][20] = { 0 };
    int n = 0, m = 1;
    int i = 0, j = 0, flag = 0;
    scanf("%d", &n);
    //...
     for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            printf("%-2d ", arr[i][j]);
        printf("\n");
    }
    return 0;
}

接下来就可以开始我们的核心部分,数据蛇形存放:
首先我们看看这个矩阵,每一次数据蛇形的方式都是向左下方移动或者向右上方移动,我们可以以此为突破口,每一次沿左下方移动就分别令控制数组下标的i 和 j分别加加和减减,以达到向左下方或者右上方移动的目的。

while (m <= n * n)
    {
        //右上旋
        while (i >= 0 && (m <= n * n) && j <= n - 1)
        {
            arr[i][j] = m++;
            i--;
            j++;
        }
        //左下旋
        while (j >= 0 && (m <= n * n) && i <= n - 1)
        {
            arr[i][j] = m++;
            i++;
            j--;
        }
    }

然后就是要着重注意的问题是:每一次从左下旋到右上旋的转弯处的状态应该如何调整。这里要注意,位于分界线左端和右端以及分界线上的转弯状态都不同,所以要分情况,如下图:
在这里插入图片描述

图中的绿色方块是每一次旋转完最后一个元素处于的位置.
1.我们可以看到,位于分界线左半边的绿色元素,只需要每次右上旋完将纵坐标加一就可以回到下一次的起始位,如下图方块1,3;而左下旋完只需要将横坐标加一就行了,如图中绿色方块2。
在这里插入图片描述

2.位于分界线上的状态,上一次是左下旋则需要横坐标加2,纵坐标加1才能返回到下一次起始位置。如下图方块4,右上旋类似:
在这里插入图片描述
3.最后是右半边的旋转状态,这次是左下旋完需要横坐标加二,纵坐标减一,如下图方块6;而右上旋完需要纵坐标加二,横坐标减一,如下图方块5
在这里插入图片描述
而如何计算旋转的次数,这里我设置了一个flag变量来记录它的旋转状态,所以完整的旋转内部是这样的:

 while (m <= n * n)
    {
        //右上旋
        while (i >= 0 && (m <= n * n) && j <= n - 1)
        {
            arr[i][j] = m++;
            i--;
            j++;
        }
        flag++;
        if (flag < n)//分界线左边
            i++;
        else if (flag == n)//分界线
        {
            i += 2;
            j--;
        }
        else//分界线右边
        {
            i += 2;
            j--;
        }
        //左下旋
        while (j >= 0 && (m <= n * n) && i <= n - 1)
        {
            arr[i][j] = m++;
            i++;
            j--;
        }
        flag++;
        if (flag < n)//分界线左边
            j++;
        else if (flag == n)//分界线
        {
            j += 2;
            i--;
        }
        else//分界线右边
        {
            i--;
            j += 2;
        }
    }

下面是我完整的解决方法:

#include<stdio.h>

int main()
{
    int arr[20][20] = { 0 };
    int n = 0, m = 1;
    int i = 0, j = 0, flag = 0;
    scanf("%d", &n);
    //思路大概是先往右上旋,然后往左下旋,再往右上旋,如此往复
    //当其碰到边界时,停止移动
    while (m <= n * n)
    {
        //右上旋
        while (i >= 0 && (m <= n * n) && j <= n - 1)
        {
            arr[i][j] = m++;
            i--;
            j++;
        }
        flag++;
        if (flag < n)
            i++;
        else if (flag == n)
        {
            i += 2;
            j--;
        }
        else
        {
            i += 2;
            j--;
        }
        //左下旋
        while (j >= 0 && (m <= n * n) && i <= n - 1)
        {
            arr[i][j] = m++;
            i++;
            j--;
        }
        flag++;
        if (flag < n)
            j++;
        else if (flag == n)
        {
            j += 2;
            i--;
        }
        else
        {
            i--;
            j += 2;
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            printf("%-2d ", arr[i][j]);
        printf("\n");
    }
    return 0;
}

下面是我的输出结果:
n=1:

n=5:
在这里插入图片描述
n=9:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2-蛇形矩阵 的相关文章

  • mavon-editor 使用及如何将html的数据转为markdown的数据问题

    1 安装mavon editor cnpm install mavon editor s 2 页面使用
  • Python通过smtplib发送邮件

    Python通过smtplib发送邮件 1 邮件发送的步骤 2 邮箱设置 3 发送一封qq邮件 4 发送HTML格式的邮件 5 发送带附件的邮件 6 在HTML文本中添加图片 7 python给同一个人发送多封邮件 8 python给不同的
  • 5.6.2_IEEE754

    文章目录 一 引子 二 移码 1 移码与补码 2 移码本身 1 127 2 3 3 偏置值 普通情况 特殊情况 三 IEEE 754标准 1 格式 2 类型 1 短浮点数 2 double型 3 案例 1 案例一 2 案例二 4 范围 1

随机推荐

  • unity下多层随机迷宫构建

    using System Collections using System Collections Generic using UnityEngine public class Maze MonoBehaviour public GameO
  • 【Android入门到项目实战-- 11.4】—— ExoPlayer视频播放器框架的详细使用

    目录 什么是ExoPlayer 一 基本使用 1 添加依赖项 2 布局 3 Activity 二 自定义播放暂停 1 首先如何隐藏默认的开始暂停和快进 2 自定义 三 控制视频画面旋转和比例调整 四 全屏放大和缩小 1 双击视频放大缩小 2
  • python 深度学习 解决遇到的报错问题

    目录 一 解决报错ModuleNotFoundError No module named tensorflow examples 二 解决报错ModuleNotFoundError No module named tensorflow co
  • node.js + 企业微信实现定时推送消息

    一 注册企业微信及配置 进入官网 https work weixin qq com 按要求填写资料开通企业微信 1 查看企业 ID 2 创建应用 3 查看应用 AgentId Secret 下拉到页面底部还要配置IP白名单 配置IP白名单
  • 睿瞳车牌识别测试总结

    摄像头型号 睿瞳科技 IVS 通讯 通过网线 功能 当有车牌识别时 将主动向IP 端口推送数据包 重要内容 准确率和车牌号 识别ID 配置 第一步 连接摄像头 默认 192 168 1 100 第二步 更改合适的IP 第三步 配置仪表网络推
  • VBA:同时修改工作薄中以日期命名的sheet名称

    修改逻辑如下 一个月的数据放在同一个工作薄中 每天的数据为一个sheet sheet名称为当天的日期 每天的数据模版一样 只是数据更新变化 现需要把上月的sheet名称日期改为当月的 只需要把月份改为当月月份 比如7 1 7 31改为8 1
  • 基于Flowable 6.x 的工作流管理平台源码 在线流程设计器 在线流程表单设

    基于Flowable 6 x 的工作流管理平台源码 在线流程设计器 在线流程表单设计器 单节点配置表单 多实例会签任务 任务节点配置任务 执行监听器 动态配置任务候选人 其它流程相关功能点
  • Unable to find resource t64.exe in package pip._vendor.distlib报错问题解决

    Unable to find resource t64 exe in package pip vendor distlib报错问题解决 问题报错具体内容 具体解决方案 解决方法一 解决方法二 问题报错具体内容 想要对python的版本进行一
  • win7下metasploit-framework安装及使用笔记

    1 去官网下载最新版本的metasploit framework 2 下载好后 退出电脑的杀毒软件 因为安装的时候里面好多文件会被当做病毒删除 3 点击安装 下一步下一步依次即可 4 安装完成后启动 这个启动的地方我找了好久 具体启动的地方
  • FPGA实现inout的两种方法

    第一种就是使用assign语句 这种会根据代码逻辑进行综合 也会综合成三态门 但不一定是使用IOBUF这种资源 assign a in or oout 1 dz out 第二种就是使用原语 以xilinx的IOBUF为例 OBUFT为一个三
  • 再聊聊财务自由

    前段时间有人在我星球讨论财务自由 说自由的本质是选择权 有读者觉得大受启发 我就翻了一下旧文 我2017年就说过了啊 谈谈财务自由 但时过境迁 其实我想改变一下之前的说法 所谓财务自由 你虽然拥有了选择权 但并不是无限选择的权力 坦白说 这
  • 电影知识图谱和基于模板的问答系统构建

    目录 前言 一 知识图谱的构建 二 问答系统的构建 1 数据准备 1 1数据获取 1 2数据处理 1 3数据读入 1 4代码 2 问答系统设计 2 1整体流程 2 2实体识别和问题分类 2 3 问题结果查询 2 4问答模板的匹配 三 优化方
  • requests.post 小坑: 默认无超时,会阻塞

    一 遇到问题 最近遇到一个小问题 发现我的进程在调某个 API 的时候 不能正常 work 了 马上一顿 strace p pid 操作 定睛一看 发现我的进程卡在了 recvfrom 23 不动了 一直不会进入 accept 或者 epo
  • 论文笔记 Spectral Regularization Algorithms for Learning Large IncompleteMatrices (soft-impute)

    2010 JMLR 0 摘要 使用凸松弛技术为大规模矩阵完成问题提供一系列正则化低秩解决方案 论文算法 SOFT IMPUTE 迭代地用从软阈值 SVD 获得的元素替换缺失的元素 通过热启动 这使算法能够有效地计算正则化参数值网格上解决方案
  • iOS架构-组件化(Carthage管理工具)

    一 Carthage项目管理工具使用 Step 1 安装 更新Homebrew工具 1 usr bin ruby e curl fsSL https raw githubusercontent com Homebrew install ma
  • 遍历列表中的字典并取出其中的值报错string indices must be integers

    今天写爬虫的时候遇到一个问题 为了方便看我截取出其中的一部分放到测试文件中测试 我想要的是使用for循环遍历列表中的每一个字典然后取出其中某个key对应的value值 但是却报错了 报错显示string indices must be in
  • Python 数据降噪处理的四种方法——均值滤波、小波变换、奇异值分解、改变binSize

    Python 数据降噪处理的四种方法 均值滤波 小波变换 奇异值分解 改变binSize github主页 https github com Taot chen 一 均值滤波 1 算法思想 给定均值滤波窗口长度 对窗口内数据求均值 作为窗口
  • 三基色配色表java_【调色】颜色配色表 适合重彩搭配用

    三基色是指红 绿 蓝三色 各自对应的波长分别为700nm 546 1nm 435 8nm 原色 又称为基色 即用以调配其他色彩的基本色 原色的色纯度最高 最纯净 最鲜艳 可以调配出绝大多数色彩 而其他颜色不能调配出三原色 三原色通常分为两类
  • mysql怎么更新单一值_MySQL 如何快速全表更新某个字段值

    这个问题似乎没有什么好的解决方法 有个朋友提示 能否将1千万条记录拆分成多个部分 并发更新 这种比单纯的一条SQL全表更新要快一些 真的是这样吗 我做了一个实验 1 环境配置 机器配置 16核 32G MySQL 版本 5 7 19 1主2
  • 2-蛇形矩阵

    蛇形矩阵 首先我们来看问题 上面这个矩阵我们要怎么将它输出呢 我们仔细观察这个矩阵 不难发现它是有一定规律的 它的数字沿着一条蛇一样弯曲排布 那么问题来了 我们在电脑中输出都是以一行一行这样来输出的 这个矩阵的顺序明显不符合以行为参考时的输