【寒假每日一题】蛇形矩阵

2023-11-06

问题1:

题目来源:AcWing

题目链接:756. 蛇形矩阵 - 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

之前无意之间看见一位大佬写的Python题解:

代码如下:

AC code 1:

#python代码
x=[0,1,0,-1]
y=[1,0,-1,0]
cnt=1
m,n=map(int,input().split()) // 输入 m,n
z=[[0 for i in range(n)] for j in range(m)]
i=0
j=0
k=0
z[i][j]=1
while cnt<m*n:
    if( (i+x[k]<0) or (i+x[k]>=m) or (j+y[k]<0) or (j+y[k]>=n) or (z[i+x[k]][j+y[k]]!=0) ):
        k=(k+1)%4
    i=i+x[k]
    j=j+y[k]
    cnt+=1
    z[i][j]=cnt
for i in range(m):
    for j in range(n):
        print(z[i][j],end=" ")
    print()

'''
作者:namelessstory
链接:https://www.acwing.com/file_system/file/content/whole/index/content/3564460/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
'''

由于我是主C++选手,于是凭借着我自学的一点点Python基础,把代码转换成了C++,代码如下:

AC code 2:

#include<iostream>

using namespace std;

int z[110][110];
int main()
{
	int x[4]={0,1,0,-1};
	int y[4]={1,0,-1,0};
	int cnt=1;
	int m,n;
	cin>>m>>n;
	
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
		{
			z[i][j]=0;	
		}
		
	int i=0,j=0,k=0;
	z[i][j]=1;
	while(cnt<m*n)
	{
		if( (i+x[k]<0) || (i+x[k]>=m) || (j+y[k]<0) || (j+y[k]>=n) || (z[i+x[k]][j+y[k]]!=0) )
        	k=(k+1)%4;
   		i=i+x[k];
    	j=j+y[k];
   		cnt++;
  		z[i][j]=cnt;
	}
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			cout<<z[i][j]<<' ';
		}
		cout<<endl;
	}
    return 0;
}

emm...大佬写的代码就是不一样,看了半天没看懂解题思路。于是我就先试着调试并提交了一下,果然Accepted

之前在洛谷也看到了一个类似的题目。

问题2:

题目链接:P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

给出一个不大于 9 的正整数 n,输出 n×n 的蛇形方阵。

从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 3 个字符,前面使用空格补齐。

输入格式

输出格式

输入输出样例

输入 #1

4

输出 #1

  1  2  3  4
 12 13 14  5
 11 16 15  6
 10  9  8  7

我们再来看这道题,与之前那道题不同的是,此题输出的是 n×n 的方阵,其实只需对代码稍加修改即可。即将代码中的m换成n,同时只需要输入一个变量n即可。

(注意:此题的输出格式要求每个数字占用 3 个字符,前面使用空格补齐!!!)

否则一个测试点都通过不了,直接WA!!!)

代码如下:

AC code 3:

#include<iostream>
using namespace std;

int z[110][110];
int main()
{
	int x[4]={0,1,0,-1};
	int y[4]={1,0,-1,0};
	int cnt=1;
	int n;
	cin>>n;
	
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
		{
			z[i][j]=0;	
		}
		
	int i=0,j=0,k=0;
	z[i][j]=1;
	while(cnt<n*n)
	{
		if( (i+x[k]<0) || (i+x[k]>=n) || (j+y[k]<0) || (j+y[k]>=n) || (z[i+x[k]][j+y[k]]!=0) )
        	k=(k+1)%4;
   		i=i+x[k];
    	j=j+y[k];
   		cnt++;
  		z[i][j]=cnt;
	}
	for(int i=0;i<n;i++,cout<<endl)
		for(int j=0;j<n;j++)
			printf("%3d",z[i][j]);
	
	return 0;
}

虽然该题成功的AC了,但那位AcWing大佬写题解我还是一脸懵,于是我又翻了翻洛谷题目下的题解,翻到了一个感觉还是比较容易理解的,先附上这位大佬的代码:

AC code 4:(注意该代码是从num[1][1]开始填充的)

#include<bits/stdc++.h>
using namespace std;
int num[109][109],n;
int main()
{
	num[1][1]=1;//初始为1
	cin>>n;
	for(int i=1,j=1,tot=1;tot<n*n;){//一直填到n*n个数填完
		while(++j<=n&&!num[i][j])num[i][j]=++tot;--j;//向右
		while(++i<=n&&!num[i][j])num[i][j]=++tot;--i;//向下
		while(--j> 0&&!num[i][j])num[i][j]=++tot;++j;//向左
		while(--i> 0&&!num[i][j])num[i][j]=++tot;++i;//向上
		//注意上面几行末尾的处理(--j这种),不满足前面条件才会退出,这样进入下一个循环时实际上变量会有点问题。
		//举个例子:第一行写完,j=n+1,然后进入第二个while就根本不是在填表了(歪了)。
	}
	for(int i=1;i<=n;++i,cout<<endl)for(int j=1;j<=n;++j)
	cout<<setw(3)<<num[i][j];//输出
	return 0;
}
// 作者:UnyieldingTrilobite
// 来源:洛谷

其实代码的主要核心思想就是:一开始先向右填,按照右、下、左、上顺时针方向依次填充,但同时要保证该位置还没有未被填过(即仍为0),直到 tot 等于 n*n 时退出循环。

看了大佬写的代码,理清思路,于是我按照这种思路尝试着写了一下代码:

AC code 5:(注意这个代码是从a[0][0]开始填充的)

#include<iostream>
using namespace std;

int main()
{
	int n;
	cin>>n;
	int a[n][n];
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			a[i][j]=0;
	int i=0,j=0,c=0;
	a[i][j]=(++c); // 初始时先将a[0][0]填充为1。
	while(c<n*n)
	{
//		for(;++j<n && a[i][j]==0;)
		while(++j<n && a[i][j]==0)	// 向右 
			a[i][j]=(++c);
			j--; // 因为j先自加1再与n比较大小,因此在退出循环后j等于n,此时数组下标溢出,因此需要在退出循环后,j需要减去1。以下同理。
//		for(;++i<n && a[i][j]==0;)
		while(++i<n && a[i][j]==0) // 向下 
			a[i][j]=(++c);
			i--;
//		for(;--j>=0 && a[i][j]==0;)
		while(--j>=0 && a[i][j]==0)	// 向左 
			a[i][j]=(++c);
			j++;
//		for(;--i>=0 && a[i][j]==0;)
		while(--i>=0 && a[i][j]==0) // 向上 
			a[i][j]=(++c);
			i++;
	}
	for(int i=0;i<n;i++,cout<<endl)
		for(int j=0;j<n;j++)
			printf("%3d",a[i][j]); // 一定要注意输出格式!!!
    
    return 0;
}

我们来运行以下这个代码:

【运行结果】

这时,我们再来回到AcWing的蛇形矩阵那道题,对代码稍作修改即可。

代码如下:

AC code 6:

#include<iostream>
using namespace std;

int main()
{
	int m,n;
	cin>>m>>n;
	int a[m][n];
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
			a[i][j]=0;
	int i=0,j=0,c=0;
	a[i][j]=(++c);
	while(c<m*n)
	{
//		for(;++j<n && a[i][j]==0;)
		while(++j<n && a[i][j]==0)	// 向右 
			a[i][j]=(++c);
			j--;
//		for(;++i<n && a[i][j]==0;)
		while(++i<m && a[i][j]==0) // 向下 
			a[i][j]=(++c);
			i--;
//		for(;--j>=0 && a[i][j]==0;)
		while(--j>=0 && a[i][j]==0)	// 向左 
			a[i][j]=(++c);
			j++;
//		for(;--i>=0 && a[i][j]==0;)
		while(--i>=0 && a[i][j]==0) // 向上 
			a[i][j]=(++c);
			i++;
	}
	for(int i=0;i<m;i++,cout<<endl)
		for(int j=0;j<n;j++)
			printf("%d ",a[i][j]);
	
	return 0;
}

来运行一下代码:

【运行结果】

 这样我们就解决了蛇形矩阵这类问题lalala~

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

【寒假每日一题】蛇形矩阵 的相关文章

  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 从 Flask 运行 NPM 构建

    我有一个 React 前端 我想在与我的 python 后端 API 相同的源上提供服务 我正在尝试使用 Flask 来实现此目的 但我遇到了 Flask 找不到我的静态文件的问题 我的前端构建是用生成的npm run build in s
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • 条件类型定义

    如果我有一小段这样的代码 template
  • Python 中维基百科 API 中的 DisambiguationError 和 GuessedAtParserWarning

    我想获得维基百科与搜索词相关的可能且可接受的名称列表 在这种情况下是 电晕 当输入以下内容时 print wikipedia summary Corona 这给出了以下输出 home virej local lib python3 8 si
  • 在Raspberry pi上升级skimage版本

    我已经使用 Raspberry Pi 2 上的 synaptic 包管理器安装了 python 包 然而 skimage 模块版本 0 6 是 synaptic 中最新的可用版本 有人可以指导我如何将其升级到0 11 因为旧版本中缺少某些功
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 可以使用哪些技术来衡量 pandas/numpy 解决方案的性能

    Question 如何简洁全面地衡量下面各个功能的性能 Example 考虑数据框df df pd DataFrame Group list QLCKPXNLNTIXAWYMWACA Value 29 52 71 51 45 76 68 6
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 检测是否从psycopg2游标获取?

    假设我执行以下命令 insert into hello username values me 我跑起来就像 cursor fetchall 我收到以下错误 psycopg2 ProgrammingError no results to fe
  • minizinc python 安装

    我通过 anaconda 提示符在 python 上安装了 minizinc 就像其他软件包一样 pip install minizinc 该软件包表示已成功安装 我可以导入该模块 但是 我正在遵循基本示例https minizinc py
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何获取pandas中groupby对象中的组数?

    我想知道有多少个独特的组需要执行计算 给定一个名为 groupby 的对象dfgroup 我们如何找到组的数量 简单 快速 Pandaic ngroups 较新版本的 groupby API pandas gt 0 23 提供了此 未记录的
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • Linux系统连接华为oceanstor数据存储

    Linux系统连接华为oceanstor数据存储 一 登录检查oceanstor数据存储 二 配置linux使用的数据储存 1 创建LUN 2 创建Lun组 3 创建主机 4 创建主机组 5 创建映射关系 三 Linux客户端操作 1 查看
  • 「建议收藏」Pycharm使用教程(非常详细,非常实用)

    Pycharm使用教程 1 Jetbrains家族和Pycharm版本划分 pycharm是Jetbrains家族中的一个明星产品 Jetbrains开发了许多好用的编辑器 包括Java编辑器 IntelliJ IDEA JavaScrip
  • Atcoder Beginner Contest 300

    A N choice question AC代码 include
  • 【Java基础11】面向对象、面向过程、类、对象、封装

    一 面向对象和面向过程 面向对象 以对象为单位 通过调度组合不同的对象来完成某一个功能 面向过程 以步骤为单位 一步一步完成某一个具体的功能 二 类 1 类的定义 class 类名 在类中定义属性 方法 class student Stri
  • pytorch 多个模型 求平均

    from collections import OrderedDict import torch from models faceland d import FaceLanndInference d if name main model F
  • Vite 打包体积分析,性能提升不再困扰

    其实这个问题最好改成 rollup 打包体积分析 但是为什么我会取这个名字呢 其实这主要是由于我的习惯性引起的 因为太久没用一个东西 如果遇到问题 肯定会去围绕它自身去进行搜索 例如遇到 vite 打包分析相关问题 就会在 google 搜
  • MinIO从信息泄漏到RCE

    文章目录 信息泄露 漏洞利用 漏洞分析 漏洞修复 RCE 漏洞分析 参考文章 信息泄露 漏洞利用 如果MinIO以集群方式部署 存在信息泄露漏洞 攻击者可以通过HTTP请求获取目标进程的所有环境变量 包括MINIO SECRET KEY和M
  • 计算机网络——分层的体系结构(OSI模型/五层协议栈)

    一 基础知识 计算机网络 计算机网络是一个非常复杂的系统 涉及许多组成部分 主机 hosts 路由器 routers 各种链路 links 应用 applications 协议 protocols 硬件 软件 网络体系结构的特点 1 网络体
  • [高级数据结构C++] 树状数组进阶(求逆序对的个数)

    算法竞赛 file author jUicE g2R qq 3406291309 彬 bin 必应 一个某双流一大学通信与信息专业大二在读 brief 一直在算法竞赛学习的路上 copyright 2023 9 COPYRIGHT 原创技术
  • ROS模型构建、定位导航

    利用URDF或者Xacro文件 以XML的方式描述小车底盘 camera laser Kinect等基本机器人结构 通过Gazebo或Rviz将文件解析为图形化的机器人模型 其中很多代码可以从网络上找到 主要注意参数和坐标系的设置 例如在K
  • CSS之美化网页 span标签 与 div标签

    CSS高级特性 我们大家在学习CSS之前 肯定已经接触过了HTML了吧 那么我们为什么还要学习CSS呢 首先哈 CSS可以有效的传递页面信息 使用CSS美化过的页面文本 非常漂亮 美观 并且可以突出重点 使用户看到页面的主要内容 具有良好的
  • UE4笔记-进程/线程/网络/IO模块的相关问题记录

    吐槽 如果有Qt的开发经验 会发现其实在比较底层编程理念UE4和Qt极其相识 很多类名和用法甚至都是相同的 Q 创建线程类 UE4文档没有特别介绍关于线程模块的文章 这里自己简单记录一下 备查 目前来说UE4的线程模块还是比较简陋的 命名风
  • 如果一个节点重新安装了,处理办法

    1 安装操作系统 如果可以最好所有的包都安装上 创建用户 组 更改核心参数 bash profile 2 配制ssh 保证新的结点和原有的节点互信 3 安装asmlib 然后用 etc init d oracleasm scandisks
  • Mybatis中的动态SQL

    Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能 它存在的意义是为了解决拼接SQL语句字符串时的痛点问题 一 if 单独使用较少 if标签可通过test属性 即传递过来的数据 的表达式进行判断 若表达式的结果为t
  • 单目3D检测-坐标系、数据集

    0 单目3D检测任务 c x y z w
  • JAVA基本数据类型与byte互相转换(位运算,原码,补码)

    最近整理了之前的一些知识 做了一个java中byte类型与int long转换以及将字节信息表示成字符串形式的工具 对前面的只是做了一下复习整理 原码 反码 补码 首先这三者都是二进制码即 0 1组合 原码 最高位为符号位 0表示正数 1表
  • CAN 帧ID 与J1939 PGN 转换例子

    在saeJ1939中文版中找的三张图如下 例如 0x18 FE DF 00 110 0 0 11111110 11011111 00000000 P R DP PF PS SA 具体参数即为数据段 0 64 优先级为 P 110 2 或6
  • C语言位操作 - bit 、byte的清零,置1,提取,判断

    一 位操作概述 针对MCU的嵌入是开发中经常涉及到寄存器的操作 例如GPIO配置低寄存器GPIOx CRL 共32个bit 有时需要改变其中的一位或者几位bit值 同时不能影响其它bit位的值 例如 需要设置第0位bit 1时 不能简单的设
  • 从别人那学习什么?

    author skate time 2010 09 11 从别人那学习什么 今天在看oracle优化文档时 在诊断优化数据库时 在发现问题与解决问题这一过程中 就像我们现实中的一个缩影 思维总是天马行空 我们从出生一直到离开人世 都在 学习
  • 【寒假每日一题】蛇形矩阵

    问题1 题目来源 AcWing 题目链接 756 蛇形矩阵 AcWing题库 题目描述 输入两个整数 n 和 m 输出一个 n 行 m 列的矩阵 将数字 1 到 n m 按照回字蛇形填充至矩阵中 具体矩阵形式可参考样例 输入格式 输入共一行