ACM编程
螺旋数字矩阵
L时间限制:1sY空间限制:256MB限定语言:不限
题目描述:疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:
给出数字个数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列
C/C++实现代码:
#include <stdio.h>
#define MAX_SIZE 100
// 函数:打印n阶螺旋矩阵
void printSpiralMatrix(int n) {
int matrix[n][n];
int startRow = 0, endRow = n - 1;
int startCol = 0, endCol = n - 1;
int count = 0;
while (startRow <= endRow && startCol <= endCol) {
// 从左到右移动
for (int i = startCol; i <= endCol; i++) {
matrix[startRow][i] = ++count; // count 初始化为1,并在每次赋值后自增
}
startRow++;
// 从上到下移动
for (int i = startRow; i <= endRow; i++) {
matrix[i][endCol] = ++count;
}
endCol--;
// 避免越界,当行数或列数只剩下一行/一列时不再进行下一步
if (startRow <= endRow) {
for (int i = endCol; i >= startCol; i--) {
matrix[endRow][i] = ++count;
}
endRow--;
}
if (startCol <= endCol) {
for (int i = endRow; i >= startRow; i--) {
matrix[i][startCol] = ++count;
}
startCol++;
}
}
// 输出矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%3d ", matrix[i][j]);
}
printf("\n");
}
}
int main() {
int n;
printf("Enter the size of the square matrix: ");
scanf("%d", &n);
printSpiralMatrix(n);
return 0;
}