题目大意
按照非递增顺序打印螺旋矩阵
偶数列

奇数列

思路
1、本题中M表示列数,N表示列数,而列数小于等于行数,故可以通过列数计算出最多可以打印几圈。
用做外层循环。
2、按照红色、黄色、蓝色、白色的顺序依次对二维矩阵进行赋值
实现
#include <iostream>
#include <algorithm>
#define MAXSIZE 10001
using namespace std;
int getM(int N) //用来得到一个数的某个因子,满足题目的条件
{
int i, max = N;
for (i = N; i > 0; i--)
{
if (N%i == 0 && i >= N / i && (i - N / i) < max)
max = i;
}
return max;
}
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
int num; //元素个数
int M, N;//行、列
cin >> num;
M = getM(num); //得到行
N = num / M; //列
int i, nums[MAXSIZE];
for (i = 0; i < num; i++)
{
cin >> nums[i];
//nums[i] = i+1;
}
sort(nums, nums + num, cmp);
//动态创建二维数组
int **matrix = new int*[M];
for (int i = 0; i < M; i++)
matrix[i] = new int[N];
int m = M, n = N;
int row = 0, col = 0; //通过它们为matrix赋值
i = 0;
//画几个圆圈
for (int count = 0; count < N / 2; count++)
{
for (; col < n - 1; col++) //红色部分
{
matrix[row][col] = nums[i++];
}
for (; row < m - 1; row++) //黄色
{
matrix[row][col] = nums[i++];
}
for (col = n - 1; col > count; col--) //蓝色
{
matrix[row][col] = nums[i++];
}
for (row = m - 1; row > count; row--) //白色
{
matrix[row][col] = nums[i++];
}
n--;
m--;
row++;
i--; //打印完一圈会多加1
}
if (N % 2) //奇数列特殊处理
{
if (N > 1) //如果列数为1的话,不需要这一步,因为没有经过上面的for循环,i,row,col都是从0开始
{
col += 1; i++;
}
while (i < num)
{
matrix[row][col] = nums[i++];
row++;
}
}
for (i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
if (j == N - 1)
printf("%d", matrix[i][j]);
else
printf("%d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
本文介绍了一种算法,用于按照非递增顺序打印螺旋矩阵。首先计算矩阵的行和列数,然后按照特定颜色顺序(红黄蓝白)对矩阵进行赋值。最后,通过外层循环实现螺旋打印,特别处理了奇数列的情况。
3065

被折叠的 条评论
为什么被折叠?



