Description
给出一个不大于 9的正整数 n,输出 n×n
的蛇形方阵。
从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 3 个字符,前面使用空格补齐。
Input
输入一个正整数 n,含义如题所述。
Output
输出符合题目要求的蛇形矩阵。
Sample 1:
Input:
4
Output:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
Hint
数据保证,1≤n≤9。
思路:
我们可以将矩阵分割成多个正方形封闭线条,如4*4的矩阵的矩阵可以分割为两个正方形封闭线条,即外围的1到12(顺时针)看成第一个正方形封闭曲线,而内层的13到16(顺时针)可以看成第二个正方形封闭曲线,而对于每个正方形封闭曲线都由四条线组成(从左到右递增,然后从上到下递增,然后从右到左递增,最后从下到上递增,回到起点),四条曲线可以分成四部分程序,所以,把程序分为x(矩阵的正方形封闭曲线数量)个大部分,每个大部分又可以分成四个小部分(即从左到右递增,然后从上到下递增,然后从右到左递增,最后从下到上递增)
如图,4*4的矩阵的矩阵可以分割为两个正方形封闭线条
笔者答案:
#include<stdio.h>
int main ()
{
int i,j;//用于循环
int n;//矩阵的维度
int zs,ys;//zs:每个正方形左上角元素的列数(即纵坐标),ys:每个正方形右上角元素的列数(即纵坐标)
int p=1;//填充矩阵的数
int a[10][10];
scanf("%d",&n);
for(zs=1,ys=n;zs<(double)n/2+1;zs++,ys--)//每个循环代表一个正方形封闭线条的递增过程,以ys和zs作为每个正方形封闭线条的参数来进行循环
{
for(i=zs,j=zs;j<=ys;j++)//从左到右
{
a[i][j]=p;
p++;
}
for(i=zs+1,j=ys;i<=ys;i++)//从上到下
{
a[i][j]=p;
p++;
}
for(i=ys,j=ys-1;j>=zs;j--)//从右到左
{
a[i][j]=p;
p++;
}
for(i=ys-1,j=zs;i>zs;i--)//从下到上
{
a[i][j]=p;
p++;
}
}
for(i=1;i<=n;i++)//数组的打印
{
for(j=1;j<=n;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
易错点:
1.外部循环的结束条件为:zs<(double)n/2+1;
2.递增过程赋值时正方形的四个角的元素容易被重复赋值(如从左到右递增赋值后,“从右到下”的第一个元素应该要确保不是“从左到右赋值过程的最后一个元素”),造成结果错误;
总结:
画图能使编程思维更清晰