螺旋数字矩阵(C卷)

分值: 100分

题目描述

疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:

给出数字个数n行数m (0 < n <= 999,0 < m <= 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3...n,最终形成一个m行矩阵。

小明对这个矩阵有些要求:

  1. 每行数字的个数一样多
  2. 列的数量尽可能少
  3. 填充数字时优先填充外部
  4. 数字不够时,使用单个*号占位

输入描述

两个整数,空格隔开,依次表示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 复制代码
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();//多少个数字
        int m=in.nextInt();//行的个数
        int k=n/m;//列的个数
        if(n%m!=0){
            k++;
        }
        rotate(n,m,k);
    }

    public static void rotate(int n,int m,int k){
        int[][] nums=new int[m][k];

        int x=1;
        int i=0,j=0;
        int dir=1;//1向左,2下,3右,4上
        while (x<=n){
            nums[i][j]=x++;
            if(dir==1){
                if(j+1<k&&nums[i][j+1]==0){
                    j++;
                }else{
                    dir=2;
                    i++;
                }
            }else if(dir==2){//下
                if(i+1<m&&nums[i+1][j]==0){
                    i++;
                }else{
                    dir=3;
                    j--;
                }
            } else if (dir==3) {//you
                if(j-1>=0&&nums[i][j-1]==0){
                    j--;
                }else{
                    dir=4;
                    i--;
                }
            }else{
                if(i-1>=0&&nums[i-1][j]==0){
                    i--;
                }else{
                    dir=1;
                    j++;
                }
            }
        }
        for(int a=0;a<m;a++){
            for(int b=0;b<k;b++){
                if(nums[a][b]==0){
                    System.out.print("* ");
                }else{
                    System.out.print(nums[a][b]+" ");
                }
            }
            System.out.println();
        }

    }
}
相关推荐
快手技术6 小时前
AAAI 2026|全面发力!快手斩获 3 篇 Oral,12 篇论文入选!
前端·后端·算法
颜酱6 小时前
前端算法必备:滑动窗口从入门到很熟练(最长/最短/计数三大类型)
前端·后端·算法
做科研的周师兄6 小时前
【MATLAB 实战】栅格数据 K-Means 聚类(分块处理版)—— 解决大数据内存溢出、运行卡顿问题
人工智能·算法·机器学习·matlab·kmeans·聚类
X在敲AI代码6 小时前
leetcodeD3
数据结构·算法
码农小韩6 小时前
基于Linux的C++学习——循环
linux·c语言·开发语言·c++·算法
CoderCodingNo6 小时前
【GESP】C++五级/四级练习(双指针/数学) luogu-P1147 连续自然数和
开发语言·c++·算法
颜酱6 小时前
前端算法必备:双指针从入门到很熟练(快慢指针+相向指针+滑动窗口)
前端·后端·算法
Wect6 小时前
LeetCode 274. H 指数:两种高效解法全解析
算法·typescript
Q741_1476 小时前
海致星图招聘 数据库内核研发实习生 一轮笔试 总结复盘(2) 作答语言:C/C++ 哈夫曼编码 LRU
c语言·数据库·c++·算法·笔试·哈夫曼编码·哈夫曼树
你怎么知道我是队长6 小时前
C语言---位域
c语言·开发语言