目录
一、三角形蛇形填数
❀(1)原理
❀(2)执行程序
❀(3)运行结果
二、螺旋形蛇形填数
❀(1)原理
❀(2)执行程序
❀(3)运行结果
三、s形蛇形填数
❀(1)原理
❀(2)执行程序
❀(3)运行结果
一、三角形蛇形填数
(1)原理
1、观察图找规律,会发现,在二维数组中第一行,偶数列0、2、4时,数值由左下到右上增加,奇数列1、3、5,数值由右上到左下增加。
2、如何实现奇数列、偶数列的对角一样的数值增加?
二维数组中a[x][y] 想象为xy坐标轴
(1)偶数列时,从左下到右上,x逐渐减小x--,y逐渐增加y++,每次循环增加的值的个数为x+1;如:x为2时,此次循环有三个值。偶数列是从第一列开始,循环开始初始值,x=i,y=0。循环结束条件是 x--,直到x=0,到达第一行
(2)奇数列时,从右上到左下,x逐渐增大x++,y逐渐减小y--,每次循环增加的值的个数为y+1; 奇数列是从第一个行开始,循环开始初始值,x=0,y=i; 结束条件是:y--,直到y=0,到达第一列。
(2)执行程序
#include<stdio.h>
int main()
{int i=0;int n=0; int num=1; //第一个数为1int a[100][100]={0}; //自定义一个二维数组的大小scanf("%d",&n); //自定义一个几乘几大小的矩阵for(i=0;i<n;i++) // 执行循环n次{if(i%2==0) //判断是偶数还是奇数{int x=i; int y=0;while(x+1){a[x][y]=num;num++;y++;x--;}}else{int x=0;int y=i;while(y+1){a[x][y]=num;num++;x++;y--;}}}//打印矩阵int j = 0;for (i = 0; i < n; i++){for (j = 0; j < n; j++){printf("%-3d ", a[i][j]);}printf("\n");}return 0;
}
(3)运行结果
二、螺旋形蛇形填数
(1)原理
螺旋形,每一次循环都是经过下图的方式:
每次循环分为四个部分:
第一部分:列y=(n-1-i )不变,行x=i到 x=(n-2-i)增加
第二部分:行x=(n-1-i)不变,列y=(n-1-i)减小到 y=i+1;
第三部分:列y=i不变;行x=(n-1-i)减小到x=i+1;
第四部分:行x=i不变;列y=i增加到y=(n-2-i);
注意:
1、需要要进行螺旋形填充,只需进行n/2次循环。
2、既然进行n/2次循环,就需要判断n是奇数还是偶数
当n为偶数时,循环结束正好填满矩阵,当n为奇数时,最中间的位置最后需要单独填充
3、在数组中,n为偶数时,在数组的下标为n-1为奇数(下标为奇数但矩阵中为偶数),
所以n为奇数时,下标为偶数,最后进行填充时a[n/2][n/2]=num; 【下标 n/2在数组中为中间位置 (n/2结果取整数),在矩阵中,中间位置为下标加1,n/2+1,,,所有运算是在数组中进行,写这些是为了便于理解。】
(2)执行程序
#include<stdio.h>
int main()
{int n = 0;int a[100][100] = { 0 };scanf("%d", &n); int i = 0;int num = 1;for(i=0;i<n/2;i++) //控制循环次数 {int x=i; //定义xy的起始位置int y=n-1-i;for(x=i;x<=n-2-i;x++){a[x][y]=num;num++;}for(y=n-1-i;y>=i+1;y--){a[x][y]=num;num++;}for(x=n-1-i;x>=i+1;x--){a[x][y]=num;num++;}for(y=i;y<=n-2-i;y++){a[x][y]=num;num++;}}if(n%2!=0) //n为奇数时最中间的位置填充a[n/2][n/2]=num;int j = 0;for (i = 0; i < n; i++){for (j = 0; j < n; j++){printf("%-3d ", a[i][j]);}printf("\n");}return 0;
}
(3)运行结果
三、s形蛇形填数
(1)原理
1、观察图,偶数列0、2、4数值依次向下增加,奇数列1、3、5数值依次向上增加
2、二维数组中,偶数列时,循环初始条件,x=0,y=i,结束条件,x=n-1,此时到达最后一行下标值为n-1。奇数列时、循环初始条件,x=n-1,y=i,结束条件,x=0
(2)执行程序
#include<stdio.h>
int main()
{int n = 0;int a[100][100] = { 0 };scanf("%d", &n); //输入需要填充的数组的大小,arr[n][n]int i = 0;int num = 1;for (i = 0; i < n; i++) //需要打印n列数字{if (i % 2 == 0) //偶数列填充{int x = 0;int y = i;for (x = 0; x <=n-1; x++) {a[x][y] = num;num++;}}else //奇数列填充{int x = n - 1; //下标值为n-1,也就是最后一行int y = i;for (x = n - 1; x >= 0; x--){a[x][y] = num;num++;}}}int j = 0;for (i = 0; i < n; i++){for (j = 0; j < n; j++){printf("%-3d ", a[i][j]);}printf("\n");}return 0;
}
(3)运行结果
以上为自己理解,如有错误欢迎指正,共同学习!