本帖最后由 孙百鑫 于 2013-7-1 07:44 编辑
rt,打印螺旋数组的练习题。自己刚写出来,代码如下,欢迎指正~
(有简单方法的请跟帖贴代码,说思路)- /*
- 题目:打印螺旋数组。
- Case:
- 1 2 3 4
- 12 13 14 5
- 11 16 15 6
- 10 9 8 7
- 思路:
- 1.判断循环次数,即:有几圈;
- 2.每次循环中都遵循相同的打印规律,即:上横(左到右)-->右竖(上到下)-->下横(右到左)-->左竖(下到上);
- 3.定义需要写入的值value,初始化为0,每赋值一次,自增1;
- 4.遍历二维数组,换行打印;
- Ps:
- 1.为了使代码更具普遍性,定义一个变量size,用于表示数阵的边长。
- 2.为了增强代码的功能,将长宽相等的情况提取为任意row、column的情况。
- 想到可以将原size用row(行)和column(列)表示,扩充代码功能。
- */
- class SpiralArray
- {
- public static void main(String[] args)
- {
- int row = 7;//定义非规则数阵的长和宽
- int column = 5;
- int size = 9;//定义规则数阵(长宽相等)的边长
- int[][] arr1 = ArrayTool.setArray(size);//调用数组工具类中的setArray(int size)方法,将得到的二维数组赋给arr
- int[][] arr2 = ArrayTool.setArray(row,column);//调用数组工具类中的setArray(int row,int column)方法,将得到的二维数组赋给arr
- ArrayTool.printArr(arr1);//调用数组工具类中的打印数组方法
- System.out.println("*****************************");
- ArrayTool.printArr(arr2);
- }
- }
- //之前思路过于麻烦,代码就不写了。
- class ArrayTool//定义数组工具类
- {
- public static int[][] setArray(int size)//函数的重载。传入数阵边长,调用setArray(int row,int column)方法,返回符合规则的二维数组
- {
- int row = size;//定义行、列,分别赋值为size
- int column = size;
- int[][] arr = setArray(row,column);//函数间调用,重载
- return arr;
- }
- public static int[][] setArray(int row,int column)//传入数阵的row(行)和列(column),返回符合规则的二维数组
- {
- int loopNum = loopNum(row,column);//得到循环次数上限
- int[][] arr = new int[row][column];//定义二维数组
- int num = 1;//定义循环次数,初始化为1(最大值为loopNum)
- int value = 1;//定义写入的值,从1开始
- // int h = 0;//行指针
- // int l = 0;//列指针
- for (;num<=loopNum;num++ )//控制循环次数
- {
- for (int h=num-1,l=num-1;l<=column-num ;l++ )//每次循环的上横1
- {
- arr[h][l] = value++;
- }
- for (int h=num,l=column-num;h<=row-num ;h++ )//每次循环的右竖1
- {
- arr[h][l] = value++;
- }
- for (int h=row-num,l=column-num-1;l>=num-1 ;l-- )//每次循环的下横2
- {
- arr[h][l] = value++;
- }
- for (int h=row-num-1,l=num-1;h>=num ;h-- )//每次循环的左竖1
- {
- arr[h][l] = value++;
- }
- }
- return arr;
- }
- public static int loopNum(int row,int column)//根据数阵的行列值,判断循环次数(规律:循环次数由row与column中的小值决定)
- {
- int base = row>=column?column:row;//获取行列中的较小值作为基数
- return (base%2==0)?(base/2):((base/2)+1);//三元运算符,根据基数(row和column中的较小值)的奇偶,得到所需循环次数
- }
- private static void printArr(int[] arr)//定义打印一维数组方法
- {
- for (int x=0;x<arr.length ;x++ )
- {
- System.out.print(arr[x]+"\t");
- }
- }
- public static void printArr(int[][] arr)//重载,定义打印二维数组方法
- {
- for (int x=0;x<arr.length ;x++ )
- {
- printArr(arr[x]);//函数间调用
- System.out.println();
- }
- }
- }
复制代码 9行9列标准数阵 和 7行5列一般数阵的结果分别是:
|