回形数字矩阵
- 题目
- 大概解决思路
- 详细解决方法
- 具体详细代码:
题目
问题描述:对于任意一个整数n,可得到如下一个nxn的回形数字矩阵,其中由外而内,顺时针方向填写数字,数字从1到n^2。
输入:5
输出:
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
大概解决思路
由上图对该题目进行分析可知,
1、需要一个二维数组存储数值
2、对数组元素赋值时,发现元素赋值是向右、向下、向左、向上不断循环,直到赋值元素等于n*n
3、为了标记每个方向移动的个数,因此采用坐标移动的方式,不断的将数填至二维数组
详细解决方法
1、定义二维数组,存储回形数字矩阵;
Scanner scan = new Scanner(System.in);
System.out.print("请输入回型数:");
int a = scan.nextInt();
int[][] arr = new int[a][a];
2、将整个回型矩阵放置二维坐标中,定义此时x、y的最大值和最小值;其中x对应二维数组内层,y对应二位数组的外层(arr[x][y])
int minX=0,maxX=a-1,minY=0,maxY=a-1;
3、开始向右移动坐标值,并将数字赋值给二维数组元素值,当向右移动时,x值保持不变,y值不断增加;
for(i = minY;i<=maxY;i++) {
arr[minX][i] = number;
number++;
}
4、此时minX行的元素值已赋值成功,此时需要对minX进行修改,即minX++;
5、开始向下移动坐标值,并将数字赋值给二维数组元素值,当向下移动时,y值保持不变,x值不断增加;
for(i = minX;i<=maxX;i++) {
arr[i][maxY] = number;
number++;
}
6、此时maxY列的元素值已赋值成功,此时需要对maxY进行修改,即maxY–;
7、开始向左移动坐标值,并将数字赋值给二维数组元素值,当向左移动时,x值保持不变,y值不断减少;
for(i = maxY;i>=minY;i--) {
arr[maxX][i] = number;
number++;
}
8、此时maxX行的元素值已赋值成功,此时需要对maxX进行修改,即maxX–;
9、开始向上移动坐标值,并将数字赋值给二维数组元素值,当向上移动时,y值保持不变,x值不断减少;
for(i = maxX;i>minY;i--) {
arr[i][minY] = number;
number++;
}
10、此时minY列的元素值已赋值成功,此时需要对minY进行修改,即minY++;
11、执行完3–11的步骤后,矩阵最外层元素均已赋值,此时需要循环3-11的步骤,对内层元素进行填写,因此在整个外层加入一个while循环,直到number == n*n+1结束循环。
具体详细代码:
package com.sampson.exer;
import java.util.Scanner;
/**
*
* @Description
* @author sampson Email:2579246843@QQ.com
* @Version
* @Date 2021年1月24日下午5:26:59
*/
public class HuiXingShu {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("请输入回型数:");
int a = scan.nextInt();
int[][] arr = new int[a][a];
int number = 1;
int i,j;
int minX=0,maxX=a-1,minY=0,maxY=a-1;
while(number != a*a+1) {
for(i = minY;i<=maxY;i++) {
arr[minX][i] = number;
number++;
}
minX ++;
for(i = minX;i<=maxX;i++) {
arr[i][maxY] = number;
number++;
}
maxY --;
for(i = maxY;i>=minY;i--) {
arr[maxX][i] = number;
number++;
}
maxX--;
for(i = maxX;i>minY;i--) {
arr[i][minY] = number;
number++;
}
minY++;
}
for(i = 0;i<a;i++) {
for(j = 0;j<a;j++) {
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
}