首页 > 其他分享 >蛇形矩阵

蛇形矩阵

时间:2023-07-18 10:12:14浏览次数:38  
标签:int 矩阵 偏移量 旋转 蛇形 方向

title: 蛇形矩阵
date: 2023-07-18 08:41:17
tags:
- c/c++
categories:
- 算法
- 笔试
top:

蛇形矩阵

题目来之acwing

题目(点击跳转)

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

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

输入格式

输入共一行,包含两个整数 n 和 m。

输出格式

输出满足要求的矩阵。

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

数据范围

1≤n,m≤100

输入样例:

3 3

输出样例:

1 2 3
8 9 4
7 6 5

思路:

这个题目是一个模拟填数的题目,将数字从1开始依次按照回字规则填入n*m的矩阵中,解题的思路是模拟数字的方向,当一个方向走不通时按照顺时针旋转一下方向,这样就可以接着走了,填完之后将数组打印即可。

这边使用一个偏移量来控制方向(x轴的正方向是向下,y轴的正方形是向右)

  • 最开始肯定是从(0,0)开始y轴正方向走的,这时偏移量为(0,1)
  • 当向右走出界或者碰到已经填过的位置时,这时需要顺时针旋转方向,也就是向下即x轴的正方向走,这时偏移量为(1,0)
  • 当向下走出界或者碰到已经填过的位置时,这时需要顺时针旋转方向,也就是向左即y轴的负方向走,这时偏移量为(0,-1)
  • 当向左走出界或者碰到已经填过的位置时,这时需要顺时针旋转方向,也就是向上即x轴的负方向走,这时偏移量为(-1,0)
  • 当向上走出界或者碰到已经填过的位置时,这时需要顺时针旋转方向,也就是向右即y轴的正方向走,这是偏移量为(0,1)

可以发现,当方向旋转四次后,就会有一次循环,这是可以定义两个数组维护这个偏移量,即dx和dy

代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110;

int n, m;
int res[N][N];

int main() {
    cin >> n >> m;
    // 定义四个方向的偏移量,向右即为(dx[0],dy[0])
    int dx[]={0,1,0,-1}, dy[]={1,0,-1,0};
    
    for(int x = 0, y = 0, k = 1, d = 0; k <= n*m; k ++) {
        res[x][y] = k;
        // 计算下一个位置的坐标
        int a = x + dx[d], b = y + dy[d];
        // 判断下一个位置是否出界或者是否已经填值
        if(a<0 || a>=n || b<0 || b>=m || res[a][b]){
			// 如果已经出界,就将方向旋转,这里d+1就是将方向旋转
            // 对4取模是当最后一个方向时,加一就会超出数组下标,同时也为了实现循环数组
            d = (d + 1) % 4;
            a = x + dx[d], b = y + dy[d];
        }
        // 最后将下一个位置赋值给x, y
        x = a, y = b;
    }
    // 打印结果
    for(int i = 0; i < n; i ++ ){
        for(int j = 0; j < m; j ++ ){
            cout << res[i][j] << ' ';
        }
        cout << endl;
    }
    
    return 0;
}

标签:int,矩阵,偏移量,旋转,蛇形,方向
From: https://www.cnblogs.com/hhhhuaz/p/17562033.html

相关文章

  • 邻接表和邻接矩阵:图的两种存储方式
     引言图是一种非常重要的数据结构,它可以用来表示很多复杂的现实问题,如网络拓扑、社交关系、地图导航等。为了有效地处理图相关的算法,我们需要选择合适的存储方式来表示图中的顶点和边。本文将介绍图的两种常用存储方式:邻接表和邻接矩阵,并比较它们的优缺点。邻接矩阵邻接矩阵......
  • pytorch如何设定一个矩阵是可以被学习的
    PyTorch是一个常用的深度学习框架,它提供了灵活的机制来定义和训练神经网络模型。在PyTorch中,我们可以通过定义可学习的参数来创建可以被学习的矩阵。本文将介绍如何在PyTorch中设定一个矩阵是可学习的,并给出相应的代码示例。在PyTorch中,我们使用torch.nn.Parameter类来定义可学习......
  • 矩阵相关模板
    矩阵快速幂#include<cstdio>#include<cstring>#include<algorithm>#include<set>#include<cmath>usingnamespacestd;constintN=150;constintmod=1e9+7;typedeflonglonglld;inlineintread(){ registerintw=......
  • 矩阵LED分时点亮
    原理:分时驱动LED_PIN1,LED_PIN2,LED_PIN3为低电平。再来同时置位LED_SEG1,LED_SEG2,LED_SEG3,LED_SEG4,达到分时点亮矩阵LED的效果,缺点是LED比正常点亮暗一些,其他无差异。上程序voidswled(void){staticuint8_tledstep;if(ledstate&0x0080)//解决未开机亮灯......
  • Leetcode240.搜索二维矩阵II
    classSolution{public:boolsearchMatrix(vector<vector<int>>&matrix,inttarget){if(matrix.empty()||matrix[0].empty())returnfalse;intn=matrix.size(),m=matrix[0].size();intx=0,y=m-1;while(x&......
  • 矩阵乘法
    矩阵乘法入门矩阵类似一个二维数组吧。矩阵的运算矩阵的加法\[C_{i,j}=A_{i,j}+B_{i,j}\]我不知道有什么用。矩阵的减法\[C_{i,j}=A_{i,j}-B_{i,j}\]我也不知道有什么用。矩阵的乘法\[C_{i,j}=\sum_k^{m}A_{i,k}B_{k,j}\]即答案矩阵的第\(i\)行第\(j\)......
  • 题解 最大加权矩阵
    题目链接虽然是一道橙题,但还是蕴含了重要算法思想——降维思想。如果是一维形式,即最大子段和,我们采取先求前缀和,并固定右端点,减去左边最小的办法求。对于这题,若固定了上下边界,则可以利用列的前缀和将其“压缩”为一维形式,再采取“最大子段和”的方式求解。如下面一个二维矩阵:......
  • LeetCode 剑指 Offer 12. 矩阵中的路径
    题目链接:LeetCode剑指Offer12.矩阵中的路径题意:给定一个 mxn二维字符网格 board和一个字符串单词 word。如果 word存在于网格中,返回true;否则,返回false。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元......
  • 矩阵旋转
    矩阵旋转题目:使用C++,原地90℃旋转一个M*N的矩阵,不允许增加任何内存空间(空间复杂度为O(1))分析:1、使用一个函数rotateMatrix,这个函数通过对矩阵进行转置和中心对称交换,实现了将矩阵顺时针旋转90度。123->147->741456->258->8......
  • 单片机扫描矩阵键盘
    采用分时复用的方法,定时置位行,检测列,确定按下的按键,输出不同的按键值。voidKbScanProcess(void){//uint8_tRow=0;//按键所在行//uint8_tCol=0;//按键所在列//uint8_tRowCount=0;//按键触发行的个数,用于判断多个按键按下uint8_tColCount=0;//按键触发列的个数,用......