打印数字三角及蛇形矩阵(C语言)
题目描述:
从键盘输入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语言)相关推荐
- C语言实现上三角蛇形矩阵不用数组,蛇形矩阵c语言实现
[问题描述]蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形.如: 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 本题要求根据输入的行数要求,输出对应的一个蛇形上三角矩 ...
- 用python编写杨辉三角金字塔_用python实现三道简单算法题:杨辉三角,蛇形矩阵,金字塔...
分享几道简单的python打印输出的问题,本质上都是可以将其分解成一个大循环之中有几个小循环. 1.杨辉三角 主要特点: 每个数等于它上方两数之和. 每行数字左右对称,由1开始逐渐变大. 每行端点与结 ...
- c语言编程蛇形,蛇形矩阵c语言实现
[问题描述]蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形.如: 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 本题要求根据输入的行数要求,输出对应的一个蛇形上三角矩 ...
- C语言利用for循环打印数字三角金字塔
#include<stdio.h> int main() {int i,j;for(i = 1;i<=5;i++)//打印高度为5的数字金字塔{for(j = 1;j <= 5 ...
- 蛇形矩阵c 语言怎么写,蛇形矩阵输出是要怎么写代码,感觉没有眉目啊,大佬能说一下思想吗...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include using namespace std; void rowfill(int& ...
- C语言实现上三角蛇形矩阵不用数组,C/C++编程笔记:C++ 嵌套循环,含循环打印及蛇形矩阵实例...
也称为多循环,在一个循环中嵌套使用一个或多个循环. 嵌套循环的基本结构就是在一个循环中,循环体包含了另一个循环的情况.下面我用几个嵌套循环的例子来深入理解嵌套循环. 循环图案打印 分别打印下面三种图案 ...
- 用C语言实现蛇形矩阵的打印
输入任意阶数,即可打对应印蛇形矩阵.原理是根据蛇形矩阵的性质,运用矩阵行列对下个数字打印的方向进行判别,从而打印出对应的数字.详情请看如下参考代码. 参考代码: #include<stdio.h ...
- 蛇形矩阵 java_Java实现打印二维蛇形矩阵(螺旋矩阵)。
直接上代码吧. 昨晚腾讯在线测试遇到的题. 螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大, 向左变大,向上变大,如此循环. import java.util.Scann ...
- 蛇形矩阵 回形矩阵(学生视角最容易理解的方法)C语言 傻瓜式解题
蛇形矩阵 相信大家对于蛇形矩阵都有种朦胧的感觉,仿佛答案就在眼前但是却没戴上眼镜,那么接下来就由我帮助大家找回并戴上眼镜 首先我们来看一下这道题目: 给定你一个数,按要求在n * n的方形矩阵里填入1 ...
最新文章
- 人脸识别屡遭非议 会成为“潘多拉魔盒”吗
- 我的一次尴尬的维护经历
- 【Python】Python中的文本处理
- k8s secret使用方式:pod通过变量和volume方式使用secret
- 交换机和pc机用什么线连接_为什么要用顶角线,用发光顶角线的好处有哪些?...
- jakarta ee_在等待Jakarta EE时
- 挑战NPC(洛谷-P4258)
- go get如何删除_Go语言HTTP请求(req库)
- Android中kt转java_将我现有的andorid工作室项目转换为kotlin?
- width:100%以什么为基准的测试
- JAVA疯狂讲义 第四版 课后习题 第四章 4.5
- Ubuntu配置显卡驱动
- 关于灰鸽子和黑软的一些看法
- ros路由器cpu占用率高的原因和解决
- Typora任意更改样式
- 我的CSDN博客十年
- 全网最全实战注册苹果开发者账号教程
- C++_GUARDED_BY 和EXCLUDES属性字
- java毕业生设计学籍管理系统计算机源码+系统+mysql+调试部署+lw
- PMP考试中常见的翻译问题