Java编程典型数组回形针问题
从键盘输入一个整数(1~20)
则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。例如: 输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1 2 3 4
12 13 14 5
11 16 15 6
典型的回形针问题。开始入手的时候就要考虑总体框架,如我们发现它总是以上下左右四个方向进行的循环规律,而且相邻位置相差1,但循环多久,几次我们并不知道。换个角度考虑,矩阵的大小与元素个数是固定的,如果它有n行n列,那么只需要进行n^2次循环,该循环就能自动结束,我们可以进行一个1>n^2次的循环,并把它赋值给数组的各个元素。
首先我们完成输入矩阵大小的需求,运用Scanner函数,提前导入相应的包。
import java.util.Scanner; public class Arrexer5 { public static void main(String[] args) { Scanner scan=new Scanner(System.in); int len=scan.nextInt();
之后由于矩阵是二维的,我们需要建立一个二维数组,并同时提前定义一个变量存储矩阵所有元素的数量,为之后循环做好准备。
int c=len*len; int[][]arr=new int[len][len];
首先设置循环
for (int m = 1; m <= c; m++) {
}
之后我们考虑从上下左右四个方向开始利用m对数组进行赋值,考虑运用if函数分为4种情况,并实现首尾呼应进行循环。
int k=1;
if(k==1){ //右
}else if(k==2){ //下
}else if(k==3){ //左
}else (k==4){ //上
定义一个变量k,分为上下左右4种情况。之后我们考虑怎么把他们串起来,在该方向赋值完成以后怎么换方向赋值并停止,那么我们可以在各个情况下再使用if函数,继续分为两类情况。考虑到后续要对二维数组进行赋值,我们先定义两个变量i,j,用它们来确定数组各个元素的位置。
int i=0; int j=0;
if(k==1){ if(j<len&&arr[i][j]==0){ arr[i][j++]=m; }else{ k=2; j--; m--; i++; } }else if(k==2){ if(i<len&&arr[i][j]==0){ arr[i++][j]=m; }
以右方向为例。首先我们要确保该方向不能一直进行下去,因为矩阵是有边界的。我们让j<len,之后并上arr[i][j]==0),确保该位置未被赋值过,我们才对它进行赋值。其中j++需要注意,它是先进行赋值再+1。而等全部位置赋完以后,j继续+1等于len,此时它就不满足第一个条件,我们可以考虑将它转入第二个方向了。设置k=2,之后j--,令j回到len-1,而m此时已经等于len+1,当转入下一个方向时还会进行一次循环再+1,所以需要对m--。由于下一次循环中m会是m+1,所以需要i++,正好接上下一个位置。
需要注意的时这样写else if(i<len&&k==2)是不可以的,因为它会在i=len的情况下进不了之后的任何选择,它和
if(k==1){ if(j<len&&arr[i][j]==0){
是完全不同的两种情况。
之后只需要重复以上步骤,在交界处进行数值调整,最后进行遍历得到结果。
奉上代码
import java.util.Scanner; public class Arrexer5 { public static void main(String[] args) { Scanner scan=new Scanner(System.in); int len=scan.nextInt(); int c=len*len; int[][]arr=new int[len][len]; int k=1; int i=0; int j=0; for (int m = 1; m <= c; m++) { if(k==1){ if(j<len&&arr[i][j]==0){ arr[i][j++]=m; }else{ k=2; j--; m--; i++; } } else if(k==2){ if(i<len&&arr[i][j]==0){ arr[i++][j]=m; }else{ k=3; i--; m--; j--; } }else if(k==3){ if(j>=0&&arr[i][j]==0){ arr[i][j--]=m; }else{ k=4; j++; i--; m--; } } else if(k==4){ if(i>=0&&arr[i][j]==0){ arr[i--][j]=m; }else{ k=1; i++; j++; m--; } } }
for (int d = 0; d < arr.length; d++) { for (int e = 0; e < arr[d].length; e++) { System.out.print(arr[d][e]+" "); } System.out.println(); } } }