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.hqwc.cn/news/258849.html

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

相关文章

Android File Transfer for Mac:畅享强大的安卓文件传输工具

作为一款功能强大的安卓文件传输工具&#xff0c;Android File Transfer for Mac&#xff08;以下简称AFT&#xff09;为Mac用户提供了便捷快速的安卓设备文件管理体验。无论是传输照片、音乐、视频还是文档&#xff0c;AFT都能满足你的需求&#xff0c;让你的文件传输更加高效…

目标检测mAP计算以及coco评价标准

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 讲一下目标检测中的一些常见的指标 在我们使用目标检测网络训练时 最后在验证集上会得到一个coco的评价列表 就像我们图中给的这一系列参数列表一样 我们再进一步引入两个概念 第一个叫做precisi…

Linux高级管理-搭建网站服务

在Ihternet 网络环境中&#xff0c;Web 服务无疑是最为流行的应用系统。有了Web站点&#xff0c;企业可以充分 展示自己的产品&#xff0c;宣传企业形象。Web站点还为企业提供了与客户交流、电子商务交易平台等丰富 的网络应用。部署与维护Web 服务是运维工程师必须掌握的一个技…

VisualStudio反汇编功能使用

VisualStudio反汇编功能使用 使用方法 到达断点时&#xff1a;CtrlK&#xff08;松开&#xff09;G&#xff08;后按&#xff09;唤出反汇编界面&#xff0c;就可以看到当前代码对应的汇编语言了 注意&#xff1a;进入反汇编窗口后可以F10单次调试一条汇编指令 其他&#…

基础数据结构----二叉树

二叉树的概念 1.二叉树的性质&#xff1a; 二叉树的每个节点最多有两个子节点&#xff0c;分别称为左孩子、右孩子&#xff0c;以他们为根的子树称为左子树、右子树。 二叉树的每层节点数以 2 的倍数递增&#xff0c;所以二叉树的第 i 层最多有 个节点。如果每层的节点数都…

一个不错的文章伪原创系统程序源码

一款文章伪原创系统程序源码免费分享&#xff0c;程序是站长原创的。 一共花了站长几天时间写的这个文章伪原创平台&#xff0c;程序无需数据库。 程序前端采用BootStrap框架搭建&#xff0c;后端采用PHP原生书写。 前端伪原创采用Ajax无刷新提交&#xff0c;Ajax转换到词库…

【CVE 复现】CVE-2022-0185 fsconfig之整数溢出

影响版本&#xff1a;Linux-v5.1~v5.16.2 测试版本&#xff1a;Linux-5.11.22&#xff0c;由于懒得搞环境&#xff0c;所以直接用的 bsauce 大佬提供的 测试环境 看看 patch&#xff1a; diff --git a/fs/fs_context.c b/fs/fs_context.c index b7e43a780a625b..24ce12f0db32…

打造专属小程序,乔拓云模板平台助力商家抢占先机

打造专属小程序&#xff0c;乔拓云模板平台助力商家抢占先机&#xff01;该平台涵盖全行业小程序模板&#xff0c;一键复制即可上线。 想要快速创建高效实用的小程序&#xff0c;乔拓云小程序模板开发平台为您提供了解决方案&#xff01;我们为您提供一系列精心设计的小程序模板…

零基础如何入门HarmonyOS开发?

HarmonyOS鸿蒙应用开发是当前非常热门的一个领域&#xff0c;许多人都想入门学习这个技术。但是&#xff0c;对于零基础的人来说&#xff0c;如何入门确实是一个问题。下面&#xff0c;我将从以下几个方面来介绍如何零基础入门HarmonyOS鸿蒙应用开发学习。 一、了解HarmonyOS鸿…

【ArcGIS Pro微课1000例】0053:基于SQL Server创建与启用地理数据库

之前的文章有讲述基于SQL Server创建企业级地理数据库,本文讲述在SQL Server中创建常规的关心数据库,然后在ArcGIS Pro中将其启用,转换为企业级地理数据库。 1. 在SQL Server中创建数据库** 打开SQL Server 2019,连接到数据库服务器。 展开数据库连接,在数据库上右键→新…

Windows 上安装nvm node版本管理工具 windows安装nvm 管理工具

Windows 上安装nvm node版本管理工具 windows安装nvm 管理工具 1、nvm2、安装2.1、下载 NVM 安装程序进行安装2.2、打开nvm的安装路径&#xff0c;运行终端测试是否安装成功2.3、配置环境变量&#xff0c;让nvm能在电脑全局使用2.3.1、nvm配置淘宝镜像2.3.2、nvm环境变量设置 1…

LeetCode124.二叉树中最大路径和

第一次只花了20分钟左右就完全靠自己把一道hard题做出来了。我这个方法还是非常简单非常容易理解的&#xff0c;虽然时间复杂度达到了O(n2)。以下是我的代码&#xff1a; class Solution {int max;public int maxPathSum(TreeNode root) {max Integer.MIN_VALUE;return dfs2(…