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(" ");
}
下一篇:
最简单的贪心算法--删除数字问题
