日期:2014-05-20  浏览次数:20583 次

求解一道编程题
方针的主对角之上称为“上三角”。
请设计一个用于填充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);
        }
    }