方针的主对角之上称为“上三角”。
请设计一个用于填充n阶方针的上三角区域的程序,填充的规则是1,2,3.。。。。。的自然数列,从左上角开始,按照顺时针方向螺旋填充
例如:当n=3时,输出:
1 2 3
6 4
5
当n=4时,输出
1 2 3 4
9 10 5
8 6
7
当n=4时,输出
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
------解决方案--------------------------------------------------------
一步到位的直接实现输出,难度会比较高,但你可以拆解成两步走:
1、在一个N*N的二维数组中,按照目标要求填数;
2、用双重循环输出这个N*N的目标数组。
那么难度基本在1了,但这个也不算太复杂,提示下:
1、用x、y记录处理的数组坐标;
2、用d记录移动方向,基本上只有三个方向:右0、左下1、上2;
3、从x=0,y=0,d=0开始移动;
4、循环处理:
5、用case来根据方向控制xy的值
6、检查是否撞墙(碰到边界或碰到数组中已经有数字了),撞墙退回上一格,并换方向: d = (d+1) % 3
7、发现连续撞了3次墙,说明所有空格都填好了,退出循环。
------解决方案--------------------------------------------------------
- Java code
public static void main(String[] args) { int[][] data = new int[10][10]; sf(data, 0, 1); for (int i = 0; i < data.length; i++) { for (int j = 0; j < data.length; j++) { if (data[i][j] == 0) { break; } System.out.printf("%03d,",data[i][j]); } System.out.println(); } }//递归吧,好理解//可以看成是多个同心三角形//每个边长度为f-1//每一层第一个顶点为f,f static void sf(int[][] m, int f, int s) {//边长度-1,周长刚刚好为3*floo int floo = m.length - f * 3 - 1;//横 for (int i = 0; i <= floo; i++) { m[f][f + i] = i + s; }//斜 for (int i = 0; i < floo; i++) { m[f + i][f + floo - i] = floo + i + s; }//纵 for (int i = 0; i < floo; i++) { m[f + floo - i][f] = floo + floo + i + s; } if (m.length - f * 3 > 3) { sf(m, f + 1, s + floo * 3); } }