做发型的网站,google海外版入口,用自己的网站做淘客,网站建设常用六大布局1 题目描述
疫情期间#xff0c;小明隔离在家#xff0c;百无聊赖#xff0c;在纸上写数字玩。他发明了一种写法#xff1a; 给出数字个数 n #xff08;0 n ≤ 999#xff09;和行数 m#xff08;0 m ≤ 999#xff09;#xff0c;从左上角的 1 开始…1 题目描述
疫情期间小明隔离在家百无聊赖在纸上写数字玩。他发明了一种写法 给出数字个数 n 0 n ≤ 999和行数 m0 m ≤ 999从左上角的 1 开始按照顺时针螺旋向内写方式依次写出2,3,…,n最终形成一个 m 行矩阵。 小明对这个矩阵有些要求 每行数字的个数一样多 列的数量尽可能少 填充数字时优先填充外部 数字不够时使用单个 * 号占位 2 输入描述
两个整数空格隔开依次表示 n、m
3 输出描述
符合要求的唯一矩阵
4 用例
4.1 用例1
输入
9 4输出
1 2 3
* * 4
9 * 5
8 7 64.2 用例2
输入
3 5输出
1
2
3
*
*5 题目分析·
考点这道题考的是对二维数组的使用。 解析题目中比较容易钻牛角尖的描述是每行数字的个数一样多。这句实际上是矩阵的特点可以忽略。读完题目我们发现有两个问题需要解决
1. 确定矩阵的列数
2. 设计填充的算法通过列的数量尽可能少这个需求我们可以想到最少的情况即矩阵中填充的全都是数字。那么列数 填充的数字个数n/行数向上取整。 然后是如何填充这就涉及到了二维数组的螺旋形遍历。我们可以想象一个人在背包容量限制下在顺时针绕圈捡东西当不为0则为已捡过即换方向捡。
6 Java代码
根据5中的思路我们可以写出如下代码代码中给出了详细的注释 public class SpiralMatrix {public static void main(String[] args) {//这里n和m可以修改为使用Scanner从控制台读取输入int n 120;int m 7;int columnCountMath.ceilDiv(n,m);int[][] matrix new int[m][columnCount];fillSpiral(matrix,n);for (int i 0; i m; i) {for (int j 0; j columnCount; j) {System.out.printf(%2s , matrix[i][j] 0 ? * : matrix[i][j]);}System.out.println();}}public static void fillSpiral(int[][] matrix, int total) {// 将要填充的数字从1开始int num 1;// 方向变量四个元素分别表示向右向下向左向上int[][] directions {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};// 初始化方向变量的索引0表示初始方向为向右int dir 0;// 初始化行列索引int row 0, col 0;// 继续填充直到所有的数字被填充完while (num total) {// 将数字填充到矩阵的当前位置然后数字加1matrix[row][col] num;// 尝试按照当前方向去获取新的行列索引int newRow row directions[dir][0];int newCol col directions[dir][1];// 检查新的行列索引是否超出矩阵的边界或者该位置已经被填充过// 如果是则将方向变量的索引加1取模为了形成循环向右向下向左向上if (newRow 0 || newRow matrix.length || newCol 0 || newCol matrix[0].length || matrix[newRow][newCol] ! 0) {dir (dir 1) % 4;}// 根据新的方向更新行列索引row directions[dir][0];col directions[dir][1];}}
}