当前位置: 代码迷 >> Java相关 >> 求解一道编程题,该怎么解决
  详细解决方案

求解一道编程题,该怎么解决

热度:5973   发布时间:2013-02-25 21:46:48.0
求解一道编程题
方针的主对角之上称为“上三角”。
请设计一个用于填充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);        }    }
  相关解决方案