题目描述
疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数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

posted on 2024-06-28 15:54  Hy旧人伤  阅读(209)  评论(0)    收藏  举报