C语言——螺旋矩阵(注释详解)

一、前言:

        螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环。

 

二、市面解法(较难理解,代码长度短):

根据阶数算出循环的轮数,顺时针输出一圈为一轮,在每一轮里面用四个for循环控制输出方向 

#include<stdio.h>
int main(){int i;//控制轮数 int j;//控制坐标 int k=1;//k从1加到n*n int m;//轮数 int n;//阶数 scanf("%d",&n);//输入阶数 int matrix[n][n];//为n*n的矩阵开辟空间 //计算循环轮数 if(n%2==0){m=n/2;}else{m=n/2+1;}for(i=0;i<m;i++){//m轮顺时针圈 for(j=i;j<n-i;j++){//向右输出 matrix[i][j]=k++;}//注意:从i+1开始递增,即往下挪一位才是下一个数for(j=i+1;j<n-i;j++){//向下输出 matrix[j][n-i-1]=k++;} for(j=n-i-2;j>=i;j--){//向左输出 matrix[n-i-1][j]=k++;}for(j=n-i-2;j>=i+1;j--){//向上输出 matrix[j][i]=k++;}}//输出螺旋矩阵 for(i=0;i<n;i++){for(j=0;j<n;j++){printf("%-4d",matrix[i][j]);}printf("\n");//这里记得换行 }return 0;
} 

三、暴力解法(较易理解,代码长度长) :

思路简单,即碰到边界就换方向输出

#include<stdio.h>
int main(){int n;//输出n*n的矩阵 int i;//控制行 int j;//控制列 int k=1;//k控制输入的数从1加到n*n int flag=1;//记号,1表示向右,2表示向下,3表示向左,4表示向上 scanf("%d",&n);//输入n //建立矩阵,在内存分配能保存n*n个整数的连续的内存空间 int matrix[n][n];//划分边界,让矩阵中的每一个数据都为-1,方便后续判断越界 for(i=0;i<n;i++){for(j=0;j<n;j++){matrix[i][j]=-1;}}//自此,i和j完成了使命,重新初始化i和j,完成新的任务 i=0;j=0;while(k<=n*n){//k从1加到n*n结束循环,填充完毕 if(matrix[i][j]==-1){//如果等于-1说明还未填充 matrix[i][j]=k++;//k自增,填充 }if(flag==1){//向右填充 j++;//行不变,列加1,实现向右填充 //检测边界,如果j==n或该元素不为-1,说明越界了 if(j==n||matrix[i][j]!=-1){j--;//越界了的列再减回去 flag=2;//到了边界换方向填充 }}else if(flag==2){//向下填充 i++;//行加1,列不变,实现向下填充 //检测边界,如果i==n或该元素不为-1,说明越界了 if(i==n||matrix[i][j]!=-1){i--;//越界了的行再减回去 flag=3;//到了边界换方向填充}}else if(flag==3){//向左填充 j--;//行不变,列减1,实现向左填充//检测边界,如果j==n或该元素不为-1,说明越界了 if(j==n||matrix[i][j]!=-1){j++;//越界了的列再加回去 flag=4;//到了边界换方向填充}}else if(flag==4){//向上填充 i--;//行减1,列不变,实现向上填充 //检测边界,如果i==n或该元素不为-1,说明越界了if(i==n||matrix[i][j]!=-1){i++;//越界了的行再加回去flag=1;//到了边界换方向填充}}}//输出螺旋矩阵 for(i=0;i<n;i++){for(j=0;j<n;j++){printf("%-4d",matrix[i][j]);}printf("\n");//这里记得换行 }return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ARMv8 SIMD和浮点指令编程】浮点数据转换指令——数据类型互转必备

浮点数据转换指令包括不同的浮点精度数之间的转换,还包括整型和浮点数之间的转化。 在了解数据转换指令前,必须学习 IEEE 754 定义的五种舍入规则。前两条规则舍入到最接近的值,其他的称为定向舍入: 舍入到最接近的值 Round to nearest, ties to even – rounds to the n…

Python 多线程和多进程并发执行

Python 多线程和多进程并发执行 引言多线程主要特点和概念多线程的使用threading 模块concurrent.futures 线程池 多进程主要特点和概念&#xff1a;多进程的使用&#xff1a;multiprocessing 模块concurrent.futures 进程池 选择合适的进程数 总结I/O 密集型任务CPU 密集型任务…

js过滤的方法示例

以下是几个常用的 JavaScript 过滤方法示例&#xff1a; filter() filter() 方法创建一个新的数组&#xff0c;其中包含通过测试函数的所有元素。该方法不会改变原始数组。 const numbers [1, 2, 3, 4, 5]; const filteredNumbers numbers.filter(num > num > 3); c…

销售技巧培训之如何提高建材销售技巧

建材销售市场竞争也日趋激烈。在这个充满挑战与机遇的市场中&#xff0c;掌握一定的销售技巧对于一个建材销售人员来说至关重要。本文将结合实际案例&#xff0c;探讨一些实用的建材销售技巧&#xff0c;帮助你更好地拓展业务。 一、了解客户需求 在销售过程中&#xff0c;首先…

sql2005日志文件过大如何清理

由于安装的时候没有计划好空间&#xff0c;默认装在系统盘&#xff0c;而且又没有做自动备份、截断事务日志等&#xff0c;很快LDF文件就达到十几G&#xff0c;或者几十G &#xff0c;此时就不得不处理了。 备份和计划就不说了&#xff0c;现在就说下怎么把它先删除吧&#xf…

【深度学习】一维数组的 K-Means 聚类算法理解

刚看了这个算法&#xff0c;理解如下&#xff0c;放在这里&#xff0c;备忘&#xff0c;如有错误的地方&#xff0c;请指出&#xff0c;谢谢 需要做聚类的数组我们称之为【源数组】 需要一个分组个数K变量来标记需要分多少个组&#xff0c;这个数组我们称之为【聚类中心数组】…

mysql中count(*)、count(1)、count(主键)、count(字段)的区别

文章目录 count函数的语义count(主键)count(1)count(*)count(字段)替代方案explain或者show table status中间表或者其他数据库计数 以下分析都是基于 select count(?) from table 这个语句来分析&#xff0c;不带过滤条件。 count函数的语义 count() 是一个聚合函数&#x…

BFC(Block Formatting Contexts)块级格式化上下文

块格式化上下文&#xff08;block formatting context&#xff09; 是页面上的一个独立的渲染区域&#xff0c;容器里面的子元素不会在布局上影响到外面的元素。它是决定块盒子的布局及浮动元素相互影响的一个因素。 下列情况将创建一个块格式化上下文&#xff1a; 使用float…

阿里云轻量应用服务器与云服务器ECS对比

与云服务器ECS相比&#xff0c;轻量应用服务器使用门槛较低&#xff0c;配置简便&#xff0c;能让您快速上手并部署简单的应用或网站&#xff0c;更适合个人开发者、学生等用户。本文介绍轻量应用服务器与云服务器ECS的特点和区别。 产品对比 轻量应用服务器与云服务器ECS的产…

IO多路转接之select

IO多路转接之select 1. IO多路转接&#xff08;复用&#xff09;2. select2.1 函数原型2.2 细节描述 3. 并发处理3.1 处理流程3.2 通信代码 原文链接 1. IO多路转接&#xff08;复用&#xff09; IO多路转接也称为IO多路复用&#xff0c;它是一种网络通信的手段&#xff08;机…

算法训练营Day10(栈和队列)

理论知识 java语言的栈和队列。这篇文章总结的不错 http://t.csdnimg.cn/cOC8q 232.用栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; public class MyQueue {// 3 4// in// out 4 3Stack<Integer> in;Stack<Integer> out;public My…

C# 计算两个日期的相差天数

string str1 "2017-2-13 23:59:59"; string str2 "2017-2-14 0:00:01"; DateTime d1 Convert.ToDateTime(str1); DateTime d2 Convert.ToDateTime(str2); Console.WriteLine(d1.Date); Console.WriteLine(DateTime.Now);//当前时间 Console.WriteLine(…

【目标检测算法】IOU、GIOU、DIOU、CIOU

目录 参考链接 前言 IOU(Intersection over Union) 优点 缺点 代码 存在的问题 GIOU(Generalized Intersection over Union) 来源 GIOU公式 实现代码 存在的问题 DIoU(Distance-IoU) 来源 DIOU公式 优点 实现代码 总结 参考链接 IoU系列&#xff08;IoU, GIoU…

kubernetes的服务发现(二)

如前面的文章我们说了&#xff0c;kubernetes的服务发现是服务端发现模式。它有一个服务注册中心&#xff0c;使用DNS作为服务的注册表。每个集群都会运行一个DNS服务&#xff0c;默认是CoreDNS服务。每个服务都会在这个DNS中注册。注册的大致过程&#xff1a; 1、向kube-apise…

WPF使用WebBrowser报脚本错误问题处理

前言 WPF使用WebBrowser报脚本错误问题处理,我们都知道WPF自带的WebBrowser都用的IE内核,但是在特殊的条件下我们还需要用到它,比如展示纯html简单的页面。再展示主流页面的时候比如用到Jquery高级库或者VUE等当前主流站点时经常就会报JS脚本错误,在Winform里面我们一句代…

【精选】设计模式——工厂设计模式

工厂设计模式是一种创建型设计模式&#xff0c;其主要目的是通过将对象的创建过程封装在一个工厂类中来实现对象的创建。这样可以降低客户端与具体产品类之间的耦合度&#xff0c;也便于代码的扩展和维护。 工厂设计模式&#xff1a; 以下是Java中两个常见的工厂设计模式示例…

C++ 关于结构体struct的一些总结

文章目录 一、 结构体(struct)是什么&#xff1f;&#xff08;1&#xff09;概念&#xff08;2&#xff09;struct 与 calss 的区别 二、定义、声明与初始化&#xff08;1&#xff09;三种定义结构体的方法&#xff1a;&#xff08;2&#xff09;结构体变量初始化 三、结构体嵌…

C++实现进程端口网络数据接收系统设计示例程序

一、问题描述 最近做了一道简单的系统设计题&#xff0c;大概描述如下&#xff1a; 1.一个进程可以绑定多个端口&#xff0c;用于监听接收网络中的数据&#xff0c;但是一个端口只能被一个进程占用 2.1 < pid < 65535, 1 < port < 100000, 1 < topNum < 5, …

ros2/ros安装ros-dep||rosdep init错误

第一个错误的做法&#xff1a; sudo apt-get install python3-pip sudo pip3 install 6-rosdep sudo 6-rosdep 如果使用上述代码将会摧毁整个系统&#xff0c;不重装系统反正我是搞不定啊&#xff0c;因为我不知道那个写软件的人到底做了什么。因为这个我安装的版本是humble&…

AlexNet 阅读笔记

“ImageNet Classification with Deep Convolutional Neural Networks” (Krizhevsky 等, 2012, p. 1) 使用深度卷积神经网络进行 ImageNet 分类 3公式&#xff0c;26个引用&#xff0c;4张图片&#xff0c;2个简单表格 Abstract 我们训练了一个大型深度卷积神经网络&#…