Java打印N阶回形方阵打印
某厂面试题,定义一个int类型变量N,控制台打印结果如下:
N=4: 01 02 03 04 12 13 14 05 11 16 15 06 10 09 08 07
N=6: 01 02 03 04 05 06 20 21 22 23 24 07 19 32 33 34 25 08 18 31 36 35 26 09 17 30 29 28 27 10 16 15 14 13 12 11 N的取值为正整数,按要求写出该方法。
题目分析: 以N=6的6x6阶矩阵为例: 抽象定义该矩阵每层外圈的四个角自左上到左下顺时针为:ABCD 如第一圈:01-06-11-16 第二圈的A-B-C-D为20-07-10-17 除去第一行后续方向 B-C&C-D长度相等, 且连接BD可形成等边三角形, 且其边长自N-1开始,每1个等腰三角形形成后长度-1。 抽象理解回形数字流转方向,自B开始 BC CD DA AB流转顺序为:下左上右 循环
除去第一行后,第一个等腰三角形三点为07-11-16 两腰分别为:07 08 09 10 11 - 12 13 14 15 16 长度为N-1=5 下一个三角形与此类似且长度为N-1-1=4
因此我们定义几个变量
-
方向:表示数字流转方向:下左上右 4次一循环 下左上右分别为:0 1 2 3 边长:每两条形成后,边长自N-1开始以1 为步长递减
面对N阶矩阵,可将其放入二维数组中,本文采用Java语言进行解题 NxN阶行列式 生命NxN大小的二维数组
private static final int DOWN = 0; //向下 private static final int LEFT = 1; //向左 private static final int UP = 2; //向上 private static final int RIGHT = 3; //向右 public static void main(String[] args) { int n = 6; int[][] roundsNum = new int[n][n]; int number=1; int i=0,j=0; //先单独处理第一行 while(i==0&&j<n) { roundsNum[i][j] = number++; j++; } j--;//以此题为例,因为最后一次判断时j=6 while false,因此需要进行-1处理 int direction = 0;//定义方向 int step = n-1; //初始变长 int currentStep=0;//已经步长 while(roundsNum[i][j]!=n*n) { switch(direction%4){ case DOWN: i++; break; case LEFT: j--; break; case UP: i--; break; case RIGHT: j++; break; } roundsNum[i][j] = number++; currentStep++; if(currentStep % step == 0) { direction++;//当走完一个完整长度时,方向转变 if(currentStep == step*2) { //走完一个等腰三角形,则将当前已走步数清0,并将步长减1 step--; currentStep=0; } } } for (int x=0;x<n;x++){ for (int y=0;y<n;y++){ Integer integer = new Integer(roundsNum[x][y]); if(integer.toString().length()==1){ System.out.print("0" + ""+roundsNum[x][y]+" "); } else { System.out.print(roundsNum[x][y] + " "); } } System.out.println(" "); }
下一篇:
最简单的贪心算法--删除数字问题