【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法

这篇具有很好参考价值的文章主要介绍了【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

蛇形矩阵找数的位置,每日挠头算法题,算法,矩阵,线性代数,数据结构,c++

👑作者主页:@进击的安度因
🏠学习社区:进击的安度因(个人社区)
📖专栏链接:每日挠头算法题

如果无聊的话,就来逛逛 我的博客栈 吧! 🌹

一、题目描述

链接:756. 蛇形矩阵

输入两个整数 nm ,输出一个 nm 列的矩阵,将数字 1n × m 按照回字蛇形填充至矩阵中。

具体矩阵形式可参考样例。

输入格式

输入共一行,包含两个整数 nm

输出格式

输出满足要求的矩阵。

矩阵占 n 行,每行包含 m 个空格隔开的整数。

数据范围

1 ≤ n, m ≤ 100

输入样例

3 3

输出样例

1 2 3
8 9 4
7 6 5

二、思路讲解

蛇形矩阵,就是将数字以 回字形 填充到 二维数组 中,比如这样:

蛇形矩阵找数的位置,每日挠头算法题,算法,矩阵,线性代数,数据结构,c++

我们把 二维数组的行 看做 x轴二维数组的列 看做 y轴

结合数轴,我们其实可以发现蛇形矩阵填数的规律:从左上角第一个元素开始,先向右填,碰边;向下填,碰边;向左填,碰边;向上填,碰到已经填过的位置,退回原位;向右填 … 之后就是重复上面的规律来填充。

通过规律可以发现 蛇形矩阵 填数的其实是和 x, y 两个轴是息息相关的,我们将数据的坐标记为 (x, y)

  • 向右走:(x, y) --> (x, y + 1),纵坐标 + 1
  • 向下走:(x, y) --> (x + 1, y),横坐标 + 1
  • 向左走:(x, y) --> (x, y - 1),纵坐标 - 1
  • 向上走:(x, y) --> (x - 1, y),横坐标 - 1

而上面四种移动在 题目中的具体表现 就像下面这样:

  1. x 不动 - x = 0y 向右移 - y + 1
  2. y 不动 - y = 0x 向下移 - x + 1
  3. x 不动 - x = 0y 向左移 - y - 1
  4. y 不动 - y = 0x 向上移 - x - 1

所以 xy 的坐标变化就分别有 4 种。便可以把这些移动方式存入数组:dx[] = { 0, 1, 0, -1 }, dy[] = { 1, 0, -1, 0 }

从开始填数到填数完成需要改变很多次方向,那么什么情况需要改变填数方式?

  • 填数越过左边界
  • 填数越过右边界
  • 填数越过上边界
  • 填数越过下边界
  • 填数位置已有数据

第五点 是最需要注意的,其实后面大多都是第五种情况,前四种情况基本只会在 最外一圈 用到。

在里层 碰到填过的数据 就得 “回退并拐弯” ,以免覆盖填过的数据。

到这儿主题思路其实已经讲完了,下面再讲一下细节

如果坐标 xy “飙错位置” ,如何把它 “拉回正确位置” ?可以用 ab 变量分别记录当前坐标在移动后是否超出范围,重新调整 移动方法 ,实际上就是重新选取 dxdy 数组中 合适的元素 ,然后重新计算 ab ,将坐标 拉回来 ,做出正确调整,再将 ab 赋给 xy

下面我们看看代码怎么写。文章来源地址https://www.toymoban.com/news/detail-780705.html

三、代码实现

#include <iostream>

using namespace std;

const int N = 110;

// 全局中定义数组,元素默认初始化为0
int q[N][N];

int n, m;

int main()
{
    cin >> n >> m;
    
    int dx[] = { 0, 1, 0, -1 }, dy[] = { 1, 0, -1, 0 };
    
    // 起始 x 和 y 在 (0, 0),并且 d 为 0,对应着 x 不动,y 往右走
    int x = 0, y = 0, d = 0;
    
    for (int i = 1; i <= n * m; i++)
    {
        q[x][y] = i;
        
        // 计算 a, b 的下一个位置
        int a = x + dx[d], b = y + dy[d];
        
        // 判断是否超限
        // 这里 q[a][b] 其实有一层妙用,由于全局数组是被初始化 0 的,
        // 只要填过数,q[a][b] 就必定为真
        if (a < 0 || a >= n || b < 0 || b >= m || q[a][b])
        {
            // 移动到下一个位置,% 4 获取 [0, 3] 下标
            d = (d + 1) % 4;
            a = x + dx[d], b = y + dy[d];
        }
        
        // 将正确的 a b 赋给 x y
        x = a, y = b;
    }
    
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << q[i][j] << " ";
        }
        cout << endl;
    }
    
    return 0;
}

到了这里,关于【每日挠头算法题】Acwing 756. 蛇形矩阵 —— 巧妙解法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【每日挠头算法题(1)】——旋转字符串|亲密字符串

    点我直达终点~ 前提:如果s串和goal串长度不等,则goal串不可能是s串旋转得来,直接返回false; 通过观察,可以发现每旋转一次,第一个字符就会出现在最后一个字符的位置处,其余字符均往前挪动一个位置。 所以我们首先将第一个字符保存,然后挪动其他字符,再将保存的

    2024年02月08日
    浏览(40)
  • 【每日挠头算法题(3)】字符串解码|数组中重复的数字

    点我直达~ 这道题怎么看都好像是用栈来实现,因为有左右括号。(可是第一时间我没想到) 遍历字符串,此时会有几种情况: 1.如果是数字字符,给一个 num 变量,将该字符转化成数字存储起来。 2.如果是字母(题目说只可能是小写),给一个字符串 str ,将该字母存储到字符

    2024年02月08日
    浏览(56)
  • 【每日挠头算法题(5)】重新格式化字符串|压缩字符串

    点我直达~ 1.遍历字符串,将数字字符和字母字符分别放在不同的字符串 2.如果|字母字符数量 - 数字字符数量| 1 ,则无法实现格式化,返回\\\"\\\" 3.如果不是2.中的情况,则偶数为字符必须放数量多的字符串对应的字符(下标从0开始)。 将数量多的字符串对应的字符和数量少的字

    2024年02月08日
    浏览(55)
  • 【每日挠头算法题(2)】压缩字符串|仅执行一次字符串交换能否使两个字符串相等

    点我直达~ 使用双指针法 大致过程如下: 使用双指针,分别读(read),写(write)指针,读指针不断向后走,当read指针走到最后位置处时,或read和read的下一个位置与当前位置不相等时,说明该read指针走到了某一串相同子串的最后位置处。 此时write指针开始记录具体的字符

    2024年02月08日
    浏览(52)
  • 打印回型矩阵<——>蛇形矩阵(C语言)

    目录 一:回型矩阵 二:蛇形矩形 题目要求,用户输入一个数得到这样一个图形  加入用户输入的是4,可以看出这是一个4*4的矩形,也就可以用二维数组来存放这个矩形。外卖可以看出这个矩形的规律就是 左——右        依次递增 上——下        依次递增 右——左 

    2024年02月06日
    浏览(55)
  • 蛇形矩阵蒸滴好玩

    先来看看题目: 描述 康托尔三角是由著名数学家康托尔设计的一个整数三角,可以用来证明所有有理数与自然数一一对应,亦即有理数集是一个可数集。康托尔三角的构造如下: 01 02 06 07 15 16 28 29 45 46 03 05 08 14 17 27 30 44 47 04 09 13 18 26 31 43 48 10 12 19 25 32 42 49 11 20 24 33 41 50 21

    2024年02月08日
    浏览(36)
  • 蛇形矩阵(c语言)

    输入两个整数 n 和 m,输出一个 n 行 m 列的矩阵,将数字 1 到n×m 按照回字蛇形填充至矩阵中。 具体矩阵形式可参考样例。 输入格式 输入共一行,包含两个整数 n 和 m。 输出格式 输出满足要求的矩阵。 矩阵占 n 行,每行包含 m 个空格隔开的整数。 数据范围 1≤n,m≤100 输入样

    2024年01月22日
    浏览(39)
  • C语言蛇形矩阵

    山有榛,隰有苓。云谁之思?西方美人。 --邶风·简兮 话不多说,直接看图 通过观察图表,我想到了这种方法: 我将数字放置的位置分为两大类:向右走和向左走 每大类里又分为3小类: 向左走:(1)能往左下往左下(2)左下不行向下移(3)下移不行向右移 向右走:(

    2024年01月21日
    浏览(39)
  • 蛇形矩阵python

    作者简介 :一名后端开发人员,每天分享后端开发以及人工智能相关技术,行业前沿信息,面试宝典。 座右铭 :未来是不可确定的,慢慢来是最快的。 个人主页 :极客李华-CSDN博客 合作方式 :私聊+ 这个专栏内容 :BAT等大厂常见后端java开发面试题详细讲解,更新数目10

    2024年02月12日
    浏览(31)
  • 回型矩阵|蛇形矩阵|上三角矩阵|矩阵转置|二维数组打印问题

    二维数组,作为一种存放一系列数的载体,不免和数学中用于存放数的数表——矩阵,有着密切的联系。矩阵本身就有些抽象,需要设计一个程序精准打印出来更是有难度,所以今天便来总结一些二维数组与矩阵打印的问题该如何解决。 (题目取自牛客网BC133-BC138) 给你一个

    2024年02月03日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包