蛇形矩阵
相信大家对于蛇形矩阵都有种朦胧的感觉,仿佛答案就在眼前但是却没戴上眼镜,那么接下来就由我帮助大家找回并戴上眼镜
首先我们来看一下这道题目:
给定你一个数,按要求在n * n的方形矩阵里填入1,2,3,…,n*n,要求填成蛇形。例如n=4时,该方阵为
解题思路
我们去判断它的一个打印方向,因为它每次打印的方向都是有规律的,例如本题从右上角开始打印,首先是向下打印,当它在向下打印的过程中遇到该矩阵的边界时会改变方向,而它的方向是固定的,只有从上到下,从右到左,从下到上,从左到右,方向的改变就体现的是一个循环。而它打印的数字也是固定的,例如4 * 4的矩阵那么它打印的数字就只会到16,因此我们可以将打印的数字作为循环的结束标志。
输入
4
输出
代码
int a[100][100]={},fx,fy,n; //默认二维数组中的每一位上初始数值为0 fx代表行,fy代表列
scanf("%d",&n);
fx=0;fy=n-1; //确定打印开始位置
int dir=0;//表示方向 0:从上往下 1:从右往左 2:从下往上 3:从从左到右
for(int i=1;i<=n*n;i++) //打印的值
{
a[fx][fy]=i;
//打印 第一个之后判断接下来打印的方向
switch(dir)
{
case 0: //往下打 改变的是行数,而列数没变,因此fx++,fy不变
fx++; //往下打印需要判断边界值,确定是否能继续在同方向继续打印
//判断方式 如果fx超出二维数组的边界也就是fx>=n,或者当下一位数组位置中存在不为0的数时停止打印改变方向
if(fx==n-1||a[fx+1][fy]!=0)
dir=1; //改变方向
break;
case 1: //往左打,改变的是列数,行数不变,且列数减小,因此fy--,fx不变
fy--; //同样需要判断边界值
//判断方式 如果fy超出二维数组的边界也就是fy==0,或者下一位中存在不为0的数时停止打印改变方向
if(fy==0||a[fx][fy-1]!=0)
dir=2; //改变方向
break;
case 2: //往上打,改变的是行数,列数未变 ,因此 fx--,fy不变
fx--; //老规矩判断边界值
//判断方式 如果fx超过边界值也就是fx==0,或者下一位中存在不为0的数时停止打印并改变方向
if(fx==0||a[fx-1][fy]!=0)
dir=3; //改变方向
break;
case 3: //无注释 举三反一思考
fy++;
if(fy==n-1||a[fx][fy+1]!=0)
dir=0; //一圈输出结束,回到刚开始时的方向上
break;
}
}
for(int i=0;i<=n-1;i++)
{
for(int j=0;j<=n-1;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
总结
这种方法比较傻瓜式,去判断它的边界然后改变它的行列坐标进行输出,但是比较容易理解,大家可以参考我的代码去自己思考一下更优解。