回形数格式方阵的实现
从键盘输入一个整数(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
10 9 8 7
方法一:
import java.util.Scanner; public class hello { static int[][] a; static int num; static int init=1; static int i = 0, j = 0; public static void main(String[] args) { Scanner scan = new Scanner(System.in); num = scan.nextInt(); a = new int[num+1][num+1]; a[0][0]=1; while (true) { if (direction(i, j) == 5) { break; } else{ move(direction(i,j)); } } for(int z=0;z<num;z++) { for(int k=0;k<num;k++) { System.out.print(a[z][k]+" "); } System.out.println(""); } } public static int direction(int i, int j) { if (j + 1 < num && a[i][j + 1] == 0) { return 1; } else if (i + 1 < num && a[i+1][j] == 0) { return 2; } else if (j - 1 >= 0 && a[i][j-1] == 0) { return 3; } else if (i - 1 >= 0 && a[i-1][j] == 0) { return 4; } else { return 5; } } public static int move(int x) { if(x==1) { while(j+1<num&&a[i][j+1]==0) { j++; init++; a[i][j]=init; } return 0; } else if(x==2) { while(i+1<num&&a[i+1][j]==0) { i++; init++; a[i][j]=init; } return 0; } else if(x==3) { while(j-1>=0&&a[i][j-1]==0) { j--; init++; a[i][j]=init; } return 0; } else if(x==4) { while(i-1>=0&&a[i-1][j]==0) { i--; init++; a[i][j]=init; } return 0; } return 0; } }
运行结果:
方法二:
import java.util.Scanner; public class hello { public static void main(String[] args) { Scanner scan=new Scanner(System.in); int num=scan.nextInt(); int[][] a=new int[num][num]; int mini=0,minj=0; int maxi=num-1,maxj=num-1; int data=0; while(mini<=maxi&&minj<=maxj) { for(int x=minj;x<=maxj;x++) { a[mini][x]=++data; } mini++; for(int x=mini;x<=maxi;x++) { a[x][maxj]=++data; } maxj--; for(int x=maxj;x>=minj;x--) { a[maxi][x]=++data; } maxi--; for(int x=maxi;x>=mini;x--) { a[x][minj]=++data; } minj++; } for(int i=0;i<num;i++) { for(int j=0;j<num;j++) { System.out.print(a[i][j]+" "); } System.out.println(""); } } }
运行结果:
显然第二种比第一种更优,第二种主要聚焦与maxi,maxj,mini,minj,以及根据每一次的初始化更新它们的值,来达到跳出循环的目的