从键盘输入一个整数(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
分析:通过输出结果,如果将数据存在一个二维数组中,可以看出这样一种规律,数字的填充顺序为:
1.行坐标不变列坐标递增,当列坐标超出最大范围或者要填充的位置已经被填充过,则跳转到步骤2,
2.行坐标递增列坐标不变,当行坐标超过最大范围或者要填充的位置已经被填充过,则跳转到步骤3
3.行坐标不变列坐标递减,当列坐标小于最小范围或者要填充的位置已经被填充过,则跳转到步骤4
4.行坐标递减列坐标不变,当行坐标小于最小范围或者要填充的位置已经被填充过,则跳转到步骤1
只要循环执行以上四个步骤,每执行一个步骤则填充一个数据,直到全部数据填充完则结束
对应java代码如下:
public class FillNumber
{
public static void main(String[] args)
{
int n=5;//测试数据
int[][] numberMatrix=getNumberMatrix(n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.printf("%-4d",numberMatrix[i][j]);
}
System.out.println();
}
}
public static int[][] getNumberMatrix(int n){
int[][] result=new int[n][n];
int number=1; //填充二维数组的数字
int i=0; //行下标
int j=0; //列下标
//代表如何填充数字,1表示从左到右填充,2表示从上到下填充,3表示从右到左填充,4表示下到上填充
char type=1;
while(number<=n*n){
result[i][j]=number;
if(type==1){
j++;
if(j==n||result[i][j]!=0){
type=2;
i++;
j--;
}
}else if(type==2){
i++;
if(i==n||result[i][j]!=0){
type=3;
j--;
i--;
}
}else if(type==3){
j--;
if(j==-1||result[i][j]!=0){
type=4;
j++;
i--;
}
}else{
i--;
if(i==0||result[i][j]!=0){
type=1;
i++;
j++;
}
}
number++;
}
return result;
}
}
输出结果:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9