赞
踩
疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:
给出数字个数 n 和行数 m (0 < n <= 999,0< m <= 999) ,从左上角的 1开始,按照顺时针螺旋向内写方式,依次写出 2,3…n,最终形成一个 m 行矩阵。
小明对这个矩阵有些要求:
1.每行数字的个数一样多
2.列的数量尽可能少
3.填充数字时优先填充外部
4.数字不够时,使用单个 * 号占位
两个整数,空格隔开,依次表示 n、m
符合要求的唯一矩阵
输入
9 4
输出
1 2 3
* * 4
9 * 5
8 7 6
说明:
9 个数字写成 4 行,最少需要 3 列
输入
3 5
输出
1
2
3
*
*
说明:
3 个数字写 5 行,只有一列,数字不够用 * 号填充
输入
120 7
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 19
45 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 63 20
44 83 114 115 116 117 118 119 120 * * * * * * 99 64 21
43 82 113 112 111 110 109 108 107 106 105 104 103 102 101 100 65 22
42 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 23
41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24
这是一道逻辑题。根据题目按照从左到右、从上到下、从右向左、从下想上依次遍历并更新上、下、左、右、边界值即可。时间复杂度为O(n)。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int row = scanner.nextInt();
int[][] matrix = generateMatrix(n, row);
printMatrix(matrix);
scanner.close();
}
private static int[][] generateMatrix(int n, int row) {
int col = 0;
if (n <= row) {
col = 1;
} else {
col = n % row == 0 ? n / row : n / row + 1;
}
int[][] matrix = new int[row][col];
int num = 1;
int left = 0, right = col - 1, top = 0, bottom = row - 1;
while (num <= n) {
//从左到右
for (int i = left; i <= right && num <= n; i++) {
matrix[top][i] = num++;
}
top++;
//从上到下
for (int i = top; i <= bottom && num <= n; i++) {
matrix[i][right] = num++;
}
right--;
//从右到左
for (int i = right; i >= left && num <= n; i--) {
matrix[bottom][i] = num++;
}
bottom--;
//从下到上
for (int i = bottom; i >= top && num <= n; i--) {
matrix[i][left] = num++;
}
left++;
}
return matrix;
}
//输出
private static void printMatrix(int[][] matrix) {
for (int[] row : matrix) {
for (int cell : row) {
String str = cell == 0 ? "*" : Integer.toString(cell);
System.out.print(str + " ");
}
System.out.println();
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。