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