打印数字三角及蛇形矩阵(C语言)

2023-11-18

题目描述:
从键盘输入N,输出如下图所示的N行的数字三角.
例如: N = 5,那么输出如下:
在这里插入图片描述
输入格式:
输入一个整数N,1<= N <= 45
输出格式:
输出如题所示的数字三角形,为了输出美观,每个数字栈5个字符位,右对齐(即%5d)

解题的思路:
1、定义一个45行45列的二维数组arr[N][N],用于存放对应的值
2、定义两个数组,表示它在x方向、y方向上的移动方向,并分别对这两个数组进行初始化。move_x[3] = {1,0,-1},move_y[3] = {0,1,-1},之所以这样初始化,是因为由上面图示可以直到,移动只有3个方向,向下,向右,斜上,所以如果move_x的值为0,表示向右移动,为1表示向下移动,-1表示斜上;move_y的值为0表示向下,值为1表示向右,-1表示斜上
3、定义x,y表示当前的位置,a、b表示当前位置的下一格,用于判断是否需要改变方向,d表示当前方向的下标,如果d = 0,那么move_x[0] = 1,move_y[0] = 0,说明是向下移动的,其他的同理。
改变方向的条件:如果arr[a]\[b]的值不为0,表示这一步已经走过了,那么就改变方向,如果a、b的值导致数组发生了越界,那么同样需要改变方向。这时候只要修正d的值,然后将a = x + move_x[d],b = y + move_y[d]操作即可实现方向改变

代码实现:

#include<stdio.h>
#define N 45
int main(){
  int i,j,n;//n表示数组是多少行
  int arr[N][N]={0};//将数组初始化为0,表示没有走过
  int move_x[3] = {1,0,-1},move_y[3] = {0,1,-1};//定义两个数组,表示移动的方向
  int x = 0,y = 0,a = 0,b = 0,d = 0,count = 1;//count统计各个下标下的值,定义x,y有必要的
  scanf("%d",&n);
  for(i = 0; i < n; i++){
    for(j = 0; j <= i; j++){
        //printf("d = %d, a = %d ,b = %d,x = %d ,y = %d ,count = %d\n",d,a,b,x,y,count);--可以检验移动的值是否正确
        /*
        有同学问这样是否可以呢?答案是否定的,为什么?
        这时候我们举一个例子就知道了,如果我们输入的n为5,那么这时候如果
        当前已经走到了arr[4][0]这个位置,执行arr[4][0] = 5之后,这时候
        及进行a = a + move_x[d] = 5,b = b + move_y[d] = 0,明显的是
        a >= n了,此时就进入到了if语句进行修改移动的方向,这时候d = 1,
        重点就是这里,这时候a = a + move_x[d] = 5 + 0 = 5,b = b +      
        move_y[d] = 0 + 1 = 1,发现同样是发生了越界,所以这样是不正确的。
        arr[a][b] = count;
        a = a + move_x[d];
        b = b + move_y[d];
        if(a < 0 || a >=n || b < 0 || b >=n || arr[a][b]){
            //如果发生了越界,或者这一部已经走过了,那么就更换方向
            d = (d + 1) % 3;
            a = a + move_x[d];
            b = b + move_y[d];
        }
        */
        arr[x][y] = count;//当前的位置
        a = x + move_x[d];//获取当前位置移动的下一格,然后判断是否会发生越界或者是否已经走过了,如果是,那么就修改移动方向
        b = y + move_y[d];
        if(a < 0 || a >=n || b < 0 || b >=n || arr[a][b]){
            //如果发生了越界,或者这一部已经走过了,那么就更换方向
            d = (d + 1) % 3;
            a = x + move_x[d];
            b = y + move_y[d];
        }
        x = a;
        y = b;
        count++;
    }
  }

  for(i = 0; i < n; i++){
    for(j = 0; j <= i; j++){
        printf("%5d",arr[i][j]);//将数字输出,并且按照右对齐的方式输出
    }
    printf("\n");
  }
  return 0;
}

运行结果:
在这里插入图片描述

如果不是三角形,是一个方形怎么办呢?其实理解了上面之后,解题就很简单了,只要将移动方向的数组变成4格方向即可,分别初始它的值为: move_x[4] = {1,0,-1,0},其中move_x[0]表示向下移动,move_x[1]表示向右移动,move_x[2]表示向上运动,move_x[3]表示向左移动.move_y[4] = {0,1,0,-1},其中move_y[0]表示向下运动,move_y[1]表示向右移动,move_y[2]表示向上移动,move_y[3]表示向左移动值得一提的是,如果对应的移动方向要求不是这样的话,那么就需要重新进行修改move_x,move_y数组的值.
这时候,如果输入的是5,那么最后输出的是如下图:
在这里插入图片描述
对应的代码:

#include<stdio.h>
#define N 45
int main(){
  int i,j,n;
  int arr[N][N]={0};
  int move_x[4] = {1,0,-1,0},move_y[4] = {0,1,0,-1};//定义两个数组,表示移动的方向
  int x = 0,y = 0,a = 0,b = 0,d = 0,count = 1;//count统计各个下标下的值
  scanf("%d",&n);
  for(i = 0; i < n; i++){
    for(j = 0; j < n; j++){
        //printf("d = %d, a = %d ,b = %d,x = %d ,y = %d ,count = %d\n",d,a,b,x,y,count);
        arr[x][y] = count;
        a = x + move_x[d];
        b = y + move_y[d];
        if(a < 0 || a >=n || b < 0 || b >=n || arr[a][b]){
            //如果发生了越界,或者这一部已经走过了,那么就更换方向
            d = (d + 1) % 4;//由于有4个方向,那么就要%4
            a = x + move_x[d];
            b = y + move_y[d];
        }
        x = a;
        y = b;
        count++;
    }
  }
  printf("\n");
  for(i = 0; i < n; i++){
    for(j = 0; j < n; j++){
        printf("%5d",arr[i][j]);
    }
    printf("\n");
  }
  return 0;
}

运行结果:
在这里插入图片描述
蛇形矩阵:
输入样例:5
输出:
在这里插入图片描述
通过图片分析,我们可以知道,每一行都是向着斜向上的方向移动,所以这时候我们可以通过循环即可实现向斜向上的方向移动,只需要改变对应的下标即可
对应的代码:

#include<stdio.h>
#define N 45
int main(){
  int arr[N][N] = {0};
  int n;
  int a = 0,b = 0,count = 1,i,j;//x、y表示当前的位置
  printf("请输入N:");
  scanf("%d",&n);
  for(i = 0; i < n; i++){
    a = i;
    b = 0;//重置a、b,使得a一开始等于i,b等于0
    for(j = 0; j <= i; j++){
        arr[a--][b++] = count++;//改变对应的下标即可实现向着斜向上的方向移动
    }
  }
  //输出的时候需要注意,他并不是第i行就有i个数,相反,第i行他就有n - i个数
  for(i = 0; i < n; i++){
    for(j = 0; j < n - i; j++){
        printf("%5d",arr[i][j]);
    }
    printf("\n");
  }
  return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述

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

打印数字三角及蛇形矩阵(C语言) 的相关文章

  • C语言:指针的进阶

    在之前已经学习了指针初阶相关知识 知道了指针的概念 指针就是个变量 用来存放地址 地址唯一标识一块内存空间 指针的大小固定是4 8个字节 32位平台 64位平台 指针是有类型的 指针的类型决定了指针 整数的步长 指针解引用操作的权限 指针的
  • #if...#endif的用法总结参考

    if endif的用法总结 if endif是C 种的条件编译预处理命令 有两种格式 1 ifdef 标示符 程序段1 else 程序段2 endif 表示 如果标示符已经被 define命令定义过 则编译程序段1 否则编译程序段2 2 i
  • 【C语言】 getchar()与EOF的疑难杂症

    C语言程序设计 大师写的书本 需要字斟句酌 在接触到getchar 和EOF 文件结束符 感觉到疑惑 特此记录下来 一 getchar 总结如下 1 getchar是以行为单位进行存取的 当调用getchar函数读取输入时 只有当输入字符为
  • C语言渔夫打鱼晒网问题

    如果一个渔夫从 2011 年 1 月 1 日开始每三天打一次渔 两天晒一次网 编程实现当输入 2011 1 月 1 日以后的任意一天 输出该渔夫是在打渔还是在晒网 include
  • C++小作业——简单通讯录设计

    界面展示 1 菜单界面 2 添加联系人 选择按钮1 3 显示联系人 选择按钮2 会显示当前通讯录里面的所有联系人信息 include
  • Linux下 C语言实现消息队列

    消息队列 Unix的通信机制之一 可以理解为是一个存放消息 数据 容器 将消息写入消息队列 然后再从消息队列中取消息 一般来说是先进先出的顺序 可以解决两个进程的读写速度不同 处理数据速度不同 系统耦合等问题 而且消息队列里的消息哪怕进程崩
  • 单词统计(C语言)

    简述 输入一串英文字符串 统计出现的单词数目 流程图 原理简述 定义一个字符串数组char a 100 用于接收输入的字符串 输入字符串本处运用的gets 函数 作用是从终端输入一串字符到定义的字符数组中 函数返回值是数组地址 为方便表示
  • C++中的引用

    引用的概念 引用可以看作一个已定义变量的别名 引用的语法 Type name var 普通引用在声明时必须用其它的变量进行初始化 声明时必须初始化 引用的使用举例 a和b指代的都是同一段内存空间 程序输出的结果 a 5 b 5 a和b的地址
  • 编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。

    编写一个程序 提示用户输入一周工作的小时数 然后打印工资总额 税金和净收入 首先做如下假设 基本工资 10 00美元 小时 加班 超过40小时 1 5倍的时间 税率 前300美元为15 续150美元为20 余下的为25 用 define定义
  • C语言:初阶指针和结构体

    1 指针是什么 指针理解的两个要点 指针是内存中的一个最小单元的编号 也就是地址 平时口语说的指针 通常指的是指针变量 是用来存放内存地址的变量 为了管理计算机内存空间 会把内存分为一个一个一个小的内存单元 每个内存单元占一个字节的空间 那
  • 【简单】阶乘之和

    描述 给定n的值 求Sn 1 2 3 4 5 n 之值 但Sn可能很大 因此只要求出Sn关于100007的余数 输入 输入数据有多组 每组占一行 每行一个正整数n n lt 1000 输出 每组输出一个整数 即Sn Mod 100007 样
  • 打印数字三角及蛇形矩阵(C语言)

    题目描述 从键盘输入N 输出如下图所示的N行的数字三角 例如 N 5 那么输出如下 输入格式 输入一个整数N 1 lt N lt 45 输出格式 输出如题所示的数字三角形 为了输出美观 每个数字栈5个字符位 右对齐 即 5d 解题的思路 1
  • C语言动态内存开辟,malloc,calloc,free,realloc函数使用

    目录 一 内存的动态分配 1 函数malloc 2 函数calloc 3 函数realloc 4 函数free 关于动态内存错误的操作案例 一 内存的动态分配 1 函数malloc 函数原型 void malloc size t size
  • 求字符串长度的三种方法(C语言)

    如何求字符串的长度 首先要明白字符串存储的原理 字符串存储时 是以 0 结尾 这个就可以作为判断字符串结尾的一个条件 接下来 只要有字符串的首元素地址 就可以解决求字符串长度的问题啦 第一种 普通版 int my strlen char s
  • scanf函数的读取

    scanf的处理机制 scanf 以删除的方式从缓冲区读取数据 输入设备的数据存储缓冲区 比如键盘 也就是说 scanf从缓冲区读入一个数据项 该数据项在缓冲区中就被清除掉了 而如果scanf需要读取一个数据项 返现缓冲区当前是空的 那么程
  • 数据结构双链表之(三)按值插入&&寻找&&求长度

    文章目录 1 思路 1 1 按值插入 1 2 寻找 1 3 求长度 2 代码 2 1 DList h 2 2 DList cpp 2 3 main cpp 3 结果 3 1 按值插入 3 2 寻找 3 3 求长度 1 思路 1 1 按值插入
  • 8-1运用指针比较三个数的大小

    include
  • 6-15 复制字符串

    include
  • 9-3用结构体定义学生,用函数输出学生成绩

    include
  • 6-11画图---没画出来。。。

    include

随机推荐

  • Debug Hacks学习笔记-1

    大多数Linux发行版关闭了内存转储功能 使用ulimit命令查看当前的内存转储是否有效 ulimit c 如果为0则关闭了 使用ulimit c unlimited或者设置一个上限可开启内核转储 当发生问题时进程的内存就会全部转储到内存转
  • mobaxterm设置中文界面显示_Adobe系列2020如何更改界面显示语言

    关于这个问题 网上有很多教程 最近几年版本的Adobe全家桶将界面显示语言设置放在了 AMT 文件夹下的 application xml 文件内 但我照着这些方法找了半天 发现application xml文件里根本就没有 zh CN 或
  • 目标检测之YOLOv1算法分析

    网络结构 卷积层 池化层 全连接层 输入 448 448 448 448 448 448大小的图片 输出 7 7
  • 王垠

    4 相关链接 王垠的Email shredderyin gmail com 王垠的自建博客 http www yinwang org 王垠的新浪博客 http blog sina com cn yinwang0 知乎上的 王垠 话题 htt
  • Windows脚本导入导出Mongodb数据库文件实现备份与恢复

    导出指定时间范围的数据 echo off setlocal rem 提前将MongoDB安装的bin路径加到系统环境变量PATH里面 方便直接运行mongodump命令 if not exist D MongoDB backup goto
  • js 原生导出 excel 文件

    const data name 张三 age 18 name 李四 age 20 const list 名字 t年龄 data map i gt i name t i age const blob new Blob list join n
  • quartz石英任务

    定时任务 quartz 的几大核心概念 Job 任务 我们需要完成的事情 要炸大本营 JobDetail 任务详情 任务怎么做 谁来做 执行任务需要的对象 数据信息等 张三 50吨TNT quartz 为了并发执行 Job 定义任务怎么执行
  • 安川服务器显示fn001,安川伺服辅助功能参数一览表

    辅助功能一览表 监视模式一览表 用户参数一览表 报警显示一览表 辅助功能一览表 Fn000 显示警报追踪备份数据 Fn001 设定在线自动调谐时的刚性 Fn002 微动 JOD 模式运行 Fn003 原点检索模式 Fn004 预约参数 请勿
  • Out of memory error on GPU 0. Cannot allocate xxxGB memory on GPU 0, available memory is only xxx

    本人刚刚入手cv 见解浅陋 如有不对请多多包含 根据从网上查找的资料 遇到这种情况一般有以下几种解决方法 1 在程序运行的前面添加如下代码 os environ FLAGS eager delete tensor gb 0 0 但是对我好像
  • 你也可以构建私有区块链网络

    这是我如何构建私有区块链网络的一篇文章 你也可以 没有什么比自己构建区块链更能帮助理解区块链了 以下是我们将在这篇文章中完成的内容 下图我们以前可能见过 但基本上以太坊区块链网络只是很多EVM 以太坊虚拟机 或连接到每个其他节点的 节点 来
  • DDcGAN:用于多分辨率图像融合的双判别器生成对抗网络

    目录 论文下载地址 代码下载地址 论文作者 模型讲解 背景介绍 论文解读 DDcGAN总体结构 损失函数 网络具体结构 生成器 判别器 医学影像的融合 结果分析 数据集以及参数设置 训练细节 评估指标 红外与可见光图像融合的结果与分析 对比
  • 2023安徽省“中银杯”职业技能大赛“网络安全” 项目比赛任务书

    2023安徽省 中银杯 职业技能大赛 网络安全 项目比赛任务书 2023安徽省 中银杯 职业技能大赛 网络安全 项目比赛任务书 A模块基础设施设置 安全加固 200分 A 1 登录安全加固 Windows Linux A 2 Nginx安全
  • 论文纠错(一)

    说说最近读的几篇论文的问题 果然有的论文还是不能细细地去读 一读就发现有问题 第一个是MSPCA里面的公式 7 到公式 8 那个Sr前面的2是不应该有的 也就是推导的时候出错了 第二个是GPUTENSOR里面的Gpu product的算法
  • BeyondCompare4破解

    转自 跳不出循环了 原文链接 https blog csdn net weixin 39298366 article details 84390224 将以下操作保存为bat文件 然后双击运行即可 reg delete HKEY CURRE
  • Flask数据库插件安装与配置教程

    Flask数据库插件安装与配置教程 数据插件安装 Flask使用数据库之前需要在python中安装额外的插件 这里主要用到Flask script 命令扩展解释器 PyMySQL 数据库驱动 Flask SQLAchemy ORM映射 和F
  • 【python实现网络爬虫22】唯品会商品信息实战步骤详解

    唯品会商品信息实战 1 目标网址和页面解析 2 爬虫初探 3 爬虫实操 3 1 进行商品id信息的爬取 3 2 商品id数据url构造 3 3 商品id数据格式转化及数量验证 3 4 商品详细信息获取 4 全部代码 手动反爬虫 原博地址 知
  • 可以用filament的示例material_sandbox来调整obj的pbr渲染参数,也有个gltf_viewer读取gltf模型

    如题 说不准以后导出文件就不用cesiumlab了 具体待查
  • 编程获取图像中的圆半径

    版权声明 本文为博主原创文章 转载请在显著位置标明本文出处以及作者网名 未经作者允许不得用于商业目的 即将推出EmguCV的教程 请大家还稍作等待 之前网友咨询如何获得图像中圆形的半径 其中有两个十字作为标定 十字之间距离为100mm 如下
  • 【每日运维】U盘启动盘安装 ESXi 6.7.0 安装卡在 loading /bnxtroce.v00

    问题描述 ESXi 6 7 0 安装进度卡在loading bnxtroce v00 进度处 处理方法 重新制作启动盘 写入方式改为 USB ZIP v2 设置服务器的 bios设置 启动方式改为 UEFI 重启开机安装即可
  • 打印数字三角及蛇形矩阵(C语言)

    题目描述 从键盘输入N 输出如下图所示的N行的数字三角 例如 N 5 那么输出如下 输入格式 输入一个整数N 1 lt N lt 45 输出格式 输出如题所示的数字三角形 为了输出美观 每个数字栈5个字符位 右对齐 即 5d 解题的思路 1