数字漩涡形输出

来源:互联网 发布:淘宝悠悠球哪个好 编辑:程序博客网 时间:2024/04/27 13:39

输出:

1 16 15 14 132 17 24 23 12 3 18 25 22 11 4 19 20 21 10 5 6 7 8 9


思路为使用计算机模拟数字行径路线

java代码如下:

<pre name="code" class="java">public class Test151228_3 {private static final int DOWN = 1;//方向标志位private static final int RIGHT = 2;private static final int UP = 3;private static final int LEFT = 4;private static int mWay = DOWN;//记录标志public static void main(String[] args) {int[][] array = new int[7][7];//此处定义二维数组,为防止越界,在数组外围圈补0f(array, mWay,1,1);//开始行径for (int i = 1; i < array.length -1 ; i++) {//输出for (int j = 1; j < array[i].length -1; j++) {System.out.print(array[i][j] + "\t");}System.out.println();}}/** *   aY * 0 0 0 0 0 0 0  * aX0 0 0 0 0 0 0  * 0 0 0 0 0 0 0  * 0 0 0 0 0 0 0  * 0 0 0 0 0 0 0  * 0 0 0 0 0 0 0  bX * 0 0 0 0 0 0 0  * bY */private static int i = 1;//计数private static int aX= 1;//转弯指令,转弯后指令应该改变private static int aY= 1;private static int bX= 5;private static int bY= 5;/** * 模拟行径动作 * @param array 数组 * @param way 方向 * @param x 层 * @param y 列 */private static void f(int[][] array, int way,int x,int y) {if(i > 25)return;//行径的路线为逆时针,即 下->右-> 上->左switch (way) {case DOWN://向下走array[x][y] = i;if(x >= bX || array[x+1][y] != 0){//这里判断是否转弯了(判断方法:通过指令,看下面是否已经有‘人’,防止撞上)i++;bX--;f(array,RIGHT,x,y+1);break;}i++;f(array,DOWN,x+1,y);break;case RIGHT:array[x][y] = i;if(y == bY  || array[x][y+1] != 0){i++;bY--;f(array,UP,x-1,y);break;}i++;f(array,RIGHT,x,y+1);break;case UP:array[x][y] = i;if(x == aX || array[x-1][y] != 0){i++;aX ++;f(array,LEFT,x,y-1);break;}i++;f(array,UP,x-1,y);break;case LEFT:array[x][y] = i;if(y == aY || array[x][y-1] != 0){i++;aY ++;f(array,DOWN,x+1,y);break;}i++;f(array,LEFT,x,y-1);break;}}}



下面是我们老师给出方法,也是更好的方法,找出了其中的规律:

import java.util.Scanner;public class ch2 {/** * @param args *  1 16 15 14 13 2 17 24 23 12 3 18 25 22 11 4 19 20 21 10 5 6  7  8  9   */int [][] numArray;int r1=1;//记录每层的起始的数字int sf=0;//记录每层的起始下标int se=0;//记录每层的终止下标int r2=0;//减小量public static void main(String[] args) {// TODO Auto-generated method stub    new ch2().printf();}public void printf(){int num=new Scanner(System.in).nextInt();numArray=new int[num][num];se=num;SetNum(num);for (int i = 0; i < num; i++) {for (int j = 0; j < num; j++) {System.out.print(numArray[i][j]+"\t");}System.out.println();}}public void SetNum(int num) //递归的为二维数组的赋值{if(num>0)//必须以个正数{for (int i = sf; i <se ; i++) { //为每一层的第一列和最后一列赋值numArray[i][sf]=r1;numArray[i][se-1]=r1+3*(num-1)-2*r2;r1++;r2++;}r2=1;for (int i = sf+1; i < se-1; i++) {numArray[se-1][i]=r1;numArray[sf][i]=r1+3*(num-1)-2*r2;r1++;r2++;}r2=0;sf++;//得到下一层的起始位置r1=r1+2*(num-1);se--;SetNum(num-2);}else{return; //负数退出递归}}}




0 0
原创粉丝点击