题目描述
疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数n和行数m(0 < n ≤ 999,0 < m ≤ 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3...n,最终形成一个m行矩阵。 小明对这个矩阵有些要求:
- 每行数字的个数一样多
- 列的数量尽可能少
- 填充数字时优先填充外部
- 数字不够时,使用单个*号占位
输入描述
输入一行,两个整数,空格隔开,依次表示n、m
输出描述
符合要求的唯一矩阵
测试用例1:
输入:9 4
输出:
1 2 3
* * 4
9 * 5
8 7 6
说明:9个数字写成4行,最少需要3列
测试用例2:
输入:3 5
输出:
1
2
3
*
*
说明:3个数字写5行,只有一列,数字不够用*号填充
Java 解法:
import java.util.Scanner;
public class SpiralMatrix {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
scanner.close();
// 计算列数
int cols = (n + m - 1) / m;
// 初始化矩阵
String[][] matrix = new String[m][cols];
for (int i = 0; i < m; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = "*";
}
}
// 定义方向:右、下、左、上
int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int dirIdx = 0; // 当前方向索引
int x = 0, y = 0; // 起始位置
int num = 1; // 起始数字
for (int i = 0; i < n; i++) {
matrix[x][y] = String.valueOf(num);
num++;
// 计算下一个位置
int nx = x + directions[dirIdx][0];
int ny = y + directions[dirIdx][1];
// 判断是否需要改变方向
if (nx < 0 || nx >= m || ny < 0 || ny >= cols || !matrix[nx][ny].equals("*")) {
dirIdx = (dirIdx + 1) % 4;
nx = x + directions[dirIdx][0];
ny = y + directions[dirIdx][1];
}
x = nx;
y = ny;
}
// 打印矩阵
for (int i = 0; i < m; i++) {
for (int j = 0; j < cols; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}
}
Python 解法:
import math
# 总数;行数
nums, rows = map(int, input().split())
def juzhen():
# 列数
col = int(math.ceil(nums / rows))
init_juzhen = [['*'] * col for _ in range(rows)]
# 需要填入的值
value = 1
# 填充位置点,行x ,列y
x, y = 0, 0
# 填充数据,不能填入比总数大的数据
while value <= nums:
# 向右填充行,且不能覆盖填充,x不变,y增大
while y < col and init_juzhen[x][y] == '*' and value <= nums:
init_juzhen[x][y] = str(value)
value += 1
y += 1
# 确定坐标位置
y -= 1
# 下一行
x += 1
# 向下填充数据,y不变,x增大
while x < rows and init_juzhen[x][y] == '*' and value <= nums:
init_juzhen[x][y] = str(value)
value += 1
x += 1
# 确认坐标位置
x -= 1
# 左侧一列
y -= 1
# 向左填充数据,x不变,y减小
while y >= 0 and init_juzhen[x][y] == '*' and value <= nums:
init_juzhen[x][y] = str(value)
value += 1
y -= 1
# 确认位置
y += 1
# 上一行
x -= 1
# 向上填充数据,y不变,x减小
while x >= 0 and init_juzhen[x][y] == '*' and value <= nums:
init_juzhen[x][y] = str(value)
value += 1
x -= 1
# 确认位置
x += 1
# 右侧一列
y += 1
for i in range(rows):
print(" ".join(init_juzhen[i]))
if __name__ == '__main__':
juzhen()
+++==========================================================+++
以上内容仅为个人学习记录使用。
如有转载,请附有原文出处链接。
牛客网原题链接:https://www.nowcoder.com/discuss/633959863134998528?sourceSSR=search
浙公网安备 33010602011771号