题目描述:
从键盘输入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个方向,那么就要%4a = 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等于0for(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;
}

运行结果:

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

  1. C语言实现上三角蛇形矩阵不用数组,蛇形矩阵c语言实现

    [问题描述]蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形.如: 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 本题要求根据输入的行数要求,输出对应的一个蛇形上三角矩 ...

  2. 用python编写杨辉三角金字塔_用python实现三道简单算法题:杨辉三角,蛇形矩阵,金字塔...

    分享几道简单的python打印输出的问题,本质上都是可以将其分解成一个大循环之中有几个小循环. 1.杨辉三角 主要特点: 每个数等于它上方两数之和. 每行数字左右对称,由1开始逐渐变大. 每行端点与结 ...

  3. c语言编程蛇形,蛇形矩阵c语言实现

    [问题描述]蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形.如: 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 本题要求根据输入的行数要求,输出对应的一个蛇形上三角矩 ...

  4. C语言利用for循环打印数字三角金字塔

    #include<stdio.h> int main() {int i,j;for(i = 1;i<=5;i++)//打印高度为5的数字金字塔{for(j = 1;j <= 5 ...

  5. 蛇形矩阵c 语言怎么写,蛇形矩阵输出是要怎么写代码,感觉没有眉目啊,大佬能说一下思想吗...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include using namespace std; void rowfill(int& ...

  6. C语言实现上三角蛇形矩阵不用数组,C/C++编程笔记:C++ 嵌套循环,含循环打印及蛇形矩阵实例...

    也称为多循环,在一个循环中嵌套使用一个或多个循环. 嵌套循环的基本结构就是在一个循环中,循环体包含了另一个循环的情况.下面我用几个嵌套循环的例子来深入理解嵌套循环. 循环图案打印 分别打印下面三种图案 ...

  7. 用C语言实现蛇形矩阵的打印

    输入任意阶数,即可打对应印蛇形矩阵.原理是根据蛇形矩阵的性质,运用矩阵行列对下个数字打印的方向进行判别,从而打印出对应的数字.详情请看如下参考代码. 参考代码: #include<stdio.h ...

  8. 蛇形矩阵 java_Java实现打印二维蛇形矩阵(螺旋矩阵)。

    直接上代码吧. 昨晚腾讯在线测试遇到的题. 螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大, 向左变大,向上变大,如此循环. import java.util.Scann ...

  9. 蛇形矩阵 回形矩阵(学生视角最容易理解的方法)C语言 傻瓜式解题

    蛇形矩阵 相信大家对于蛇形矩阵都有种朦胧的感觉,仿佛答案就在眼前但是却没戴上眼镜,那么接下来就由我帮助大家找回并戴上眼镜 首先我们来看一下这道题目: 给定你一个数,按要求在n * n的方形矩阵里填入1 ...

最新文章

  1. 人脸识别屡遭非议 会成为“潘多拉魔盒”吗
  2. 我的一次尴尬的维护经历
  3. 【Python】Python中的文本处理
  4. k8s secret使用方式:pod通过变量和volume方式使用secret
  5. 交换机和pc机用什么线连接_为什么要用顶角线,用发光顶角线的好处有哪些?...
  6. jakarta ee_在等待Jakarta EE时
  7. 挑战NPC(洛谷-P4258)
  8. go get如何删除_Go语言HTTP请求(req库)
  9. Android中kt转java_将我现有的andorid工作室项目转换为kotlin?
  10. width:100%以什么为基准的测试
  11. JAVA疯狂讲义 第四版 课后习题 第四章 4.5
  12. Ubuntu配置显卡驱动
  13. 关于灰鸽子和黑软的一些看法
  14. ros路由器cpu占用率高的原因和解决
  15. Typora任意更改样式
  16. 我的CSDN博客十年
  17. 全网最全实战注册苹果开发者账号教程
  18. C++_GUARDED_BY 和EXCLUDES属性字
  19. java毕业生设计学籍管理系统计算机源码+系统+mysql+调试部署+lw
  20. PMP考试中常见的翻译问题

热门文章

  1. 如何CentOS 6.8上安装Chrome 谷歌浏览器
  2. hadoop伪分布式环境的搭建配置整理
  3. haskell中的Monad小记
  4. 第十五周总结——静一静吧
  5. 恢复 nouveau驱动
  6. 推断因果关系理论(inferred causation)(下)
  7. jQuery ztree 自制一套 灰蓝皮肤
  8. mac 打开多个终端快捷键
  9. 1116学习记录 简单练车模型
  10. 如何删除桌面上的Internet explorer图标