螺旋数字矩阵(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();
        }

    }
}
相关推荐
海清河晏1111 小时前
数据结构 | 单循环链表
数据结构·算法·链表
wuweijianlove5 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong5 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志5 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
沫璃染墨5 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
黎阳之光6 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_116 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia6 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg6 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒6 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode