9、 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。
* 解题思路:
* 想象成一个人绕圈行走,所以要有方向,一个方向走到头,该方向的步数就要减少一步,直到循环足够退出。
* 1.循环时的四个边界
* 2.方向变换的条件
* 3.退出条件
- public class test9 {
- //开始循环的数从1开始
- public static int beginNum = 1;
- //数组的大小
- public static final int aryNum = 10;
- //初始化行走方向,向左。 这里1表示向左,2表示向下,3表示向右,4表示向上
- public static final int direction = 1;
- public static void main(String[] args) {
-
- int[][] num = new int[aryNum][aryNum];
- setNum(0, 0, 0, aryNum, 0, aryNum, direction, num);
- for(int a = 0;a<aryNum;a++){
- for(int b=0;b < aryNum;b++){
- System.out.print(num[a][b]+"\t");
- }
- System.out.println("\n");
- }
- }
-
- /*
- * x:数组的一维坐标
- * y:数组的二维坐标
- * boundaryLeftY:数组的左边界,从0开始
- * boundaryRightY:数组右边界,限制为数组的长度减一
- * boundaryTopX:数组的上边界,从1开始,因为开始循环的时候最上方就已经占据了一行
- * boundaryBottomX:数组的下边界,限制为数组的长度减一
- * direction:行走的方向
- * num:数组对象
- */
- public static void setNum(int x,int y,int boundaryLeftY,int boundaryRightY,int boundaryTopX,
- int boundaryBottomX,int direction,int[][] num){
- //当累加的量超过数组的平方大小就退出
- if(beginNum > aryNum*aryNum){
- return;
- }
- System.out.println("x="+x+" y="+y+" direction="+direction+" boundaryBottomX="+boundaryBottomX);
- switch (direction) {
- //向左方向
- case 1:
- //不断向该方向填充数据
- num[x][y++] = beginNum++;
- //当y累加超过该方向的限制的时候就换方向
- if(y > boundaryRightY - 1){
- //y已经超过数据界限,所以必须对它重新赋值
- y = boundaryRightY - 1;
- //为下个方向累加
- x++;
- //换方向
- setNum(x, y, boundaryLeftY, boundaryRightY - 1,boundaryTopX, boundaryBottomX,2, num);
- }
- //不需要变换方向
- setNum(x, y, boundaryLeftY,boundaryRightY,boundaryTopX, boundaryBottomX, 1 , num);
- break;
- //向下方向
- case 2:
- num[x++][y] = beginNum++;
- if(x > boundaryBottomX - 1){
- x = boundaryBottomX - 1;
- y--;
- setNum(x, y, boundaryLeftY, boundaryRightY,boundaryTopX, boundaryBottomX - 1,3, num);
- }
- setNum(x, y, boundaryLeftY,boundaryRightY,boundaryTopX, boundaryBottomX, 2 , num);
- break;
- //向右方向
- case 3:
- num[x][y--] = beginNum++;
- if(y < boundaryLeftY){
- y = boundaryLeftY;
- x--;
- setNum(x, y, boundaryLeftY+1, boundaryRightY,boundaryTopX, boundaryBottomX,4, num);
- }
- setNum(x, y, boundaryLeftY,boundaryRightY,boundaryTopX, boundaryBottomX, 3 , num);
- break;
- //向上方向
- case 4:
- num[x--][y] = beginNum++;
- if(x < boundaryTopX + 1){
- x = boundaryTopX + 1;
- y++;
- setNum(x, y, boundaryLeftY, boundaryRightY,boundaryTopX+1, boundaryBottomX,1, num);
- }
- setNum(x, y, boundaryLeftY,boundaryRightY,boundaryTopX, boundaryBottomX, 4 , num);
- break;
- default:
- break;
- }
- }
- }
复制代码
刚开始对这道题真是无从下手,想了好久,做这道题真的是觉得项目不是做出来,而是调试出来的。
代码中有不足之处请大家多提出来,互相学习。 |
|