HZNUOJ 1601 方阵填数(蛇形填法)
题目描述
Description
在一个N x N的方阵中,填入1,2,……N,共N x N(N≤10)个数,并要求构成如下的格式:
例:
N=5
13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9 8 7 6 5
N=6
16 17 18 19 20 1
15 30 31 32 21 2
14 29 36 33 22 3
13 28 35 34 23 4
12 27 26 25 24 5
11 10 9 8 7 6
Input
N
Output
方阵。
同一行的数字用空格隔开。每行末尾不要有多余的空格。
解题思路和注意点
本题的是个相对简单的找规律的题目,主要是灵活运用二维数组的 i 和 j 下标来确定输出的顺序,使其符合样例规律。通过观察可知,填数的规律是从矩阵外围的右上角从1开始,先沿着列,再沿着行,顺时针累加,对应到二维数组中来,具体如下:
- 先确定填数停止的条件 ,不止一种,这里采用的是累加的数 k = N2 时,即 N x N 矩阵能填下的所有数都填完了为止;
- 顺时针填数的步骤可以分解为下左上右,从最外层循环直至最内层填完
- 下:使列坐标,即 j ,固定为N,使 i 从 1 到 N 改变,从而实现对最外层一列的向下修改,此时 i 循环到了 N ;
- 左:使行坐标,即 i ,固定为N,使 j 从 N-1 到 1 改变,从而实现对最外层一行的向左修改,此时 j 循环到了 1;
同理,上和右的操作是类似的,但是要注意行列坐标固定的值
- 上:使列坐标,即 j ,固定为1,使 i 从N-1 到 1 改变;
- 右:使行坐标,即 i ,固定为1,使 j 从 2 到 N-1 改变;
- 这样就完成了最外圈的循环,第二圈的操作可以从第 2 行和 第 N-1 列开始,同理第三圈就是从第 3 行和 第 N-2 列开始,如此类推,只需要将 i 和 j 的固定值不停的缩小直到把 N2 填出了为止。
PS:为了方便,可以判断下一步是否重复填写来实现转向(撞到之前填过的位置了需要转向操作了,可以初始化二维数组为0,那么不为0的就是已经填过了),这样可以简化判断转向的条件,具体看代码就能理解