本帖最后由 郑飞 于 2014-9-5 04:05 编辑
分享入学测试题 , 不知道代码还能不能再优化,或者有没其他简单方法 :- /*
- 1、 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
- 1 2 3 4
- 12 13 14 5
- 11 16 15 6
- 10 9 8 7
- 思路和步骤:
- 1:利用二维数组 列为里面的一维数组
- 2:给元素赋值 依题意可知方阵开始走动,必然有一边是被堵住 而且纵横交替因此 定义两个方法 一个横向一个纵向
- 横向:左右都走一遍 而后转入纵向 如此循环 利用最大元素值n的平方来控制跳出循环
- 3:跳出循环时必然赋值完毕,打印二维数组.
- */
- class Exam1
- {
- private static String insert = "";
- public static void main(String[] args)
- {
- test(4);
- }
- //横向赋值的时候 必然有一边是被堵的
- public static void setX(int[][] arr,int x,int y,int count)
- {
- if(arr[x][y]==arr.length*arr.length)//如果走到头了就退出
- return;
- if((x+1)<arr.length)//向右边走
- {
- while(arr[x+1][y]==0)
- {
- arr[x+1][y] = count++;
- x++;
- if((x+1)>=arr.length)
- break;
- }
- }
- if((x-1)>=0)//向左走
- {
- while(arr[x-1][y]==0)
- {
- arr[x-1][y] = count++;
- x--;
- if((x-1)<0)
- break;
- }
- }
- setY(arr,x,y,count);//调用纵向方法
- }
- public static void setY(int[][] arr,int x,int y,int count)
- {
- if((y+1)<arr[x].length)//直接向下走
- {
- while(arr[x][y+1]==0)
- {
- arr[x][y+1] = count++;
- y++;
- if((y+1)>=arr[x].length)
- break;
- }
- }
- if((y-1)>=0)//向上走
- {
- while(arr[x][y-1]==0)
- {
- arr[x][y-1] = count++;
- y--;
- if((y-1)<0)
- break;
- }
- }
- setX(arr,x,y,count);//调用横向方法
- }
-
- public static void test(int n)
- {
- int[][] arr = new int[n][n];//初始化二维数组
- arr[0][0] = 1;//给第一个元素赋值(因为set方法中是从第二个元素开始赋值)
- setX(arr,0,0,2);//从x=0,y=0位置开始,第二个元素开始赋值,所以count传入2.
- printArr(arr);//打印数组
- }
- public static void printArr(int[][] arr)
- {
- for (int x=0;x<arr[0].length ;x++ )//遍历打印二维数组
- {
- for (int y=0;y<arr.length ;y++ )
- {
- System.out.print(blank(arr,arr[y][x])+arr[y][x]+" ");//打印插入空格后的元素
- insert = "";
- }
- System.out.println("");//打印所有第二维某一行后,换行.
- }
- }
- public static String blank(int[][] arr,int value)//传入当前数组和当前元素值,返回该插入的空格.
- {
- int len = (arr.length*arr.length+"").length();//得到该数组最大值该有的长度
- len = len - (value+"").length();//得到该插入的空格数
- while (len>=0)//添加空格
- {
- insert = insert+" ";
- len--;
- }
- return insert;
- }
- }
复制代码
|
|