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(); } } }

经验分享 程序员 微信小程序 职场和发展