栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

顺时针螺旋顺序填充n*n的二维数组(java)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

顺时针螺旋顺序填充n*n的二维数组(java)

输入一个整数n,为二维数组的边长

然后以顺时针螺旋的顺序把1-n*n填入这个数组

比如

输入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

输入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

把矩阵以层分开,

        比如5*5的第一层是1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16,

        第二层是17 18 19 20 21 22 23 24

        第三层是25

可以观察出以下规律:

1. 最长对角线关系

        当n+1时,最外层的最长对角线([0][0]坐标减[n-1][n-1]坐标)差+2

                如4*4矩阵中,最长对角线的差是6,

                5*5矩阵中则是8

        同一层,每当纵坐标或横坐标+1时,该对角线差-2

                如5*5矩阵中[0][1]-[3][4]=6,[0][2]-[2][4]=4,

                [1][0]-[4][3]=6

        同一矩阵每进入下一层,最长对角线差-4

                如5*5矩阵中[0][0]-[4][4]=8

                [1][1]-[3][3]=4

2.最长对角线中的小对角线关系

        小对角线差是,比如对于第一层来说是[0][0]与[1][1], 对于第二层来说是[1][1]与[2][2]

        每进一层这个差-8

                如5*5中第一层中[0][0]-[4][4]=16,

                第二层中[1][1]-[3][3]=8

3.每层左上角与往下一个坐标的关系

        比如第一层的这个关系就是[0][0]与[0][1]的差,第二层则是[1][1]与[1][2]的差

        每进一层这个差-8        

                如5*5中第一层的[0][0]-[0][1]就是15,第二层则是7

知道了这些关系以后,只要通过输入的n来计算它们的初始值,然后放进for循环并在每个循环结束时进行相应的加减就行了。

import java.util.*;
public class Fill{
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		int row = s.nextInt();
		int[][] matrix = new int[row][row];
		int diagonal = row+(row-2);//最大对角线差,见规律1
        int oneDiagonal = vertical +1;//小对角线差,见规律2
		int vertical = 3+(row-2)*4;//每层左上角与下方值的差,见规律3
		int cur = 1;
		for(int i = 0; i<((row+1)/2); i++) {
			int initialCur = cur;
			int initialDiagonal = diagonal;
			for(int j = i; j<(row-i); j++) {//给对角线右半边赋值
				matrix[i][j] = cur;
				matrix[row-1-j][row-1-i] = cur + diagonal;
				cur++;
				diagonal -= 2;
			}
			diagonal = initialDiagonal - 2;
			cur = initialCur + vertical;
			for(int j = i; j<(row-i-1); j++) {//给对角线左半边赋值
				matrix[j+1][i] = cur;
				matrix[row-1-i][row-1-j-1] = cur - diagonal;
				diagonal -= 2;
				cur--;
			}
			diagonal=initialDiagonal-4;
			cur = initialCur + (oneDiagonal-i*8);
			vertical = vertical - 8;
		}
		for(int r = 0; r 

如有纠正与改善,请大家一定要告诉我··!

第一次写文章 谢谢谢谢谢谢谢谢谢了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/350923.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号