题目描述
疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:
给出数字个数 n (0 < n ≤ 999)和行数 m(0 < m ≤ 999),从左上角的 1 开始,按照顺时针螺旋向内写方式,依次写出2,3,....,n,最终形成一个 m 行矩阵。
小明对这个矩阵有些要求:
- 每行数字的个数一样多
- 列的数量尽可能少
- 填充数字时优先填充外部
- 数字不够时,使用单个 * 号占位
输入描述
两个整数,空格隔开,依次表示 n、m
输出描述
符合要求的唯一矩阵
输入:
9 4
输出:
1 2 3
* * 4
9 * 5
8 7 6
import java.util.Scanner;
/**
* <h1>螺旋数字矩阵</h1>
*
* 分析:
* num的个数: n
* 行数: m
* 列数: l = n/m + 1
* num 和 * 的总数: m*l
* * 的个数: x = l*m - n
*
*/
public class Main {
public static void main(String[] args) throws InterruptedException {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNext()) { // 注意 while 处理多个 case
String input = in.nextLine();
String[] inputs = input.split("\\s+");
int n = Integer.parseInt(inputs[0]);
int m = Integer.parseInt(inputs[1]);
process(n, m);
}
}
private static void process(int n, int m) {
// 列数
int l = n / m + 1;
// 定义二维数组
int x = m;
int y = l;
int[][] intArr = new int[x][y];
// 从1开始填充
int num = 1;
// 循环一次,顺时针转一圈
int k = 0;
while (true) {
// 填充的数字大于二维数组的容量时,结束
if (num > l * m) {
break;
}
// 顺时针转一圈
// 上
for (int i = k; i < y - 1; i++) {
intArr[k][i] = num;
num++;
if (num > l * m) {
break;
}
}
// 右
for (int i = k; i < x - 1; i++) {
intArr[i][y - 1] = num;
num++;
if (num > l * m) {
break;
}
}
// 下
for (int i = y - 1; i > k; i--) {
intArr[x - 1][i] = num;
num++;
if (num > l * m) {
break;
}
}
// 左
for (int i = x - 1; i > k; i--) {
intArr[i][k] = num;
num++;
if (num > l * m) {
break;
}
}
x--;
y--;
k++;
}
// 遍历数组
for (int i = 0; i < m; i++) {
for (int j = 0; j < l; j++) {
// 对应位置的数值大于n时,打印“*” -- 加了制表符,格式清晰
if (intArr[i][j] > n) {
System.out.print("*" + "\t");
} else {
System.out.print(intArr[i][j] + "\t");
}
}
System.out.println();
}
}
}
标签:intArr,数字,螺旋,int,矩阵,break,++,num,-- From: https://blog.csdn.net/J1e_Sir/article/details/140547104