1.题目介绍
描述
给你一个整数n,按要求输出n∗n的回型矩阵
输入描述:
输入一行,包含一个整数n
1<=n<=19
输出描述:
输出n行,每行包含n个正整数.
示例:
2.题目分析
由题干与上面示例可知数字是螺旋(回旋)输出的。
我们要寻找到数组的规律:以示例为例子
观察两图片,n=4时与n=5时数字都旋转了两个圈,唯一不同时n=5时数组中间为25.
由此可知数字旋转的圈数实际为n/2,当n为奇数时中间的数字为n*n。
数字是由1开始按照→↓←↑的顺序逐渐增加,我们按照此顺序寻找规律,并将规律转化为代码的形式。
a.→方向分析
观察图片中箭头指向→的数字。第一行数字横坐标为零,纵坐标从0增加到3结束(4个数字),第二行横坐标为1,纵坐标从1到2结束(共两个数字)。
b.↓方向分析
观察图片中箭头指向↓的数字。外面一列下标为4,横坐标从0增加到3结束(4个数字),前一列纵坐标为3,横坐标从1到2(两个数字)。
c.←方向分析
观察图片中箭头指向←的数字。底下一行横坐标为4,纵坐标从4到1(4个数字),上一行横坐标为3,纵坐标从3到2(两个数字)。
d.↑方向分析
观察图片中箭头指向↑的数字。第一列纵坐标为0,横坐标从4到1(4个数字),后一列纵坐标为1,横坐标从3到2(两个数字)
3.代码
1.代码分析
定义题目需要的相关变量:N(题目输入的n),n(控制数字循环圈数),i(控制横坐标),j(控制纵坐标),num(表示从1递增的数字)。
由上面分析N为奇数时数组中心位置数字为N*N。所以代码要先对对N是奇数还是偶数进行判断。
在根据↑↓←→方向规律写出代码.此过程中同一圈→与←是横坐标不发生变化,↑↓是纵坐标不发生变化,可以根据圈数n与输入的N控制。变化的坐标根据从哪开始打印几个到哪结束,根据N,n进行控制。
最后打印数组
2.实现代码
int main()
{
int N = 0, num = 1;
int i, j;
int n;
int arr[20][20] = { 0 };
scanf("%d", &N);
//判断N是不是奇数
if (N % 2 != 0)
{
arr[N / 2][N / 2] = N * N;
}
for (n = 0; n < N / 2; n++)
{
//→方向
for (j = n; j < N - n - 1; j++)
{
arr[n][j] = num++;
}
//↓方向
for (i = n; i < N - n - 1; i++)
{
arr[i][N - n - 1] = num++;
}
//左反向
for (j = N - n - 1; j >= n + 1; j--)
{
arr[N - n - 1][j] = num++;
}
//↑方向
for (i = N - n - 1; i >= n + 1; i--)
{
arr[i][n] = num++;
}
}
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
printf("%2d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
4结尾
此题是根据运行结果,根据同一方向的变化,寻找相似点,找出规律。
可以根据此题为入手,对于这种类似题型有大概思考的方向,为以后解决问题打下基础。
下一篇也是相关二维数组的题型,题目名称为蛇形矩阵。题目如下:
大家可以写一写这道题,提升自己,具体解决方法在下一篇文章中,欢迎大家一起学习讨论。
此文章中方法或代码有错误或可以优化地方欢迎大家提出来,我及时修改改正,喜欢此文章的,感觉对自己有帮助的,不要忘了关注加点赞。