回形数字矩阵

  • 题目
  • 大概解决思路
  • 详细解决方法
  • 具体详细代码:

题目

问题描述:对于任意一个整数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

大概解决思路

java 重写返回类型 java回写数据_System


由上图对该题目进行分析可知,

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

}