Java学习笔记10_数组实践(回形数)

题目

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

}

参考

https://www.cnblogs.com/wendcn/p/10403111.html
https://blog.csdn.net/sinat_37976731/article/details/78614723

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值