刷题精选:顺时针输出递增数组(螺旋递增升天数组)
Posted bit_zhy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题精选:顺时针输出递增数组(螺旋递增升天数组)相关的知识,希望对你有一定的参考价值。
刷题精选:顺时针输出递增数组
题目描述
由上图描述,输入一个数字n,代表n行n列,之后经过函数之后顺时针的将从1到n打印出来。
算法分析
通过找规律,我们可以发现,最终的结果是一个正方形,那么我们可以联想到用一个二维数组按顺序来存储这些数字,最后输出二维数组即可,同时,这些数字是一圈一圈按照顺时针递增的,因此我们可以将这个二维数组拆开一圈一圈来看,我们画图来表示一下
以n=5为例
最后的二维数组需要储存成这个样子,那么我们可以将其分为三圈
第一圈:
第二圈:
第三圈:
我们如果按照圈来储存的话,那么他们按照顺时针存储的规律就是一样的了,即先顺序的储存最上边的一行,然后顺序的储存最右边的一列,之后再倒序的存储最下边的一行,最后倒序的存储最左边的一行,那么储存完一圈后,继续按照这个循环,每存储完一圈之后,开始行,结束行,开始列,结束列都会靠近(因为圈变小了)最后的第三圈只有一个数字,那么这个时候意味着开始行和结束行,开始列结束列已经相同了,当开始行大于结束行,开始列大于结束列时,循环结束,即二维数组储存完毕,最后直接输出二维数组即可
代码分析
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* User: hp
* Date: 2022-07-12
* Time: 11:08
*/
public class Dragon
public static void main(String[] args)
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
//建立一个二维数组,储存所有的数字的顺时针版本,最后只需输出这个二维数组即可
int[][] result= new int[number][number];
//开始列,因为是数组因此以0开头
int startC = 0;
//结束列,因为是数组为了不使得下标超出因此-1
int endC = number - 1;
int startR = 0;
int endR = number - 1;
//定义计数器,记录每个位置的数字
int count = 1;
//每次循环过程中四个变量都会逐渐接近,当start大于end时,结束循环
while(startC <= endC && startR <= endR)
//先输出顶行的,顺序输出(从左向右)
//从起始列开始,到结束列
for (int i = startC; i <= endC; i++)
result[startR][i] = count;
count++;
//每一顶行输出完,下一次就是下一行了,因此startR++
startR++;
//输出右边一列的,顺序输出(从上到下)
//从当时的起始行开始,因为上边循环已经输出完了顶行,因此直接从下一行开始输出
//刚刚已经对startR++了,所以直接使得i=startR即可
for (int i = startR; i <= endR; i++)
result[i][endC] = count;
count++;
//因为输出完了右边一列,右边一列意味着结束列,下一次执行这个for循环则会是
//这一列的内部(左边)一列,因此endR--
endC--;
//再输出底部一行,倒序输出(从右向左),直接由当前的结束列开始
for (int i = endC; i >= startC; i--)
result[endR][i] = count;
count++;
//底部一行填充完毕,因此endR--
endR--;
//在输出左边一列,也是从结束行开始,倒序输出(从下到上)
for (int i = endR; i >= startR; i--)
result[i][startC] = count;
count++;
//左边一列填充完毕,开始列加一startC++
startC++;
//输出数组
for (int i = 0; i < number; i++)
for (int j = 0; j < number; j++)
System.out.print(result[i][j] + " ");
System.out.println();
以上是关于刷题精选:顺时针输出递增数组(螺旋递增升天数组)的主要内容,如果未能解决你的问题,请参考以下文章