从键盘输入一个整数(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();
}
}
}