题目 :本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m−n 取所有可能值中的最小值。
输入格式:
输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 104,相邻数字以空格分隔。
输出格式:
输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。
输入样例:
12
37 76 20 98 76 42 53 95 60 81 58 93
输出样例:
98 95 93
42 37 81
53 20 76
58 60 76
找规律:
//对于整个矩阵,每次循环确定一圈的数字
//第一次循环,找规律,可以看出,每次循环确定的元素位置随循环次数有规律变动
//m行n列 a[m][n]
//数字从大到小排序
//水平 a[0][0]~a[0][n-1]
//垂直 a[0][n-1]~a[m-1]a[n-1]
//水平 a[m-1]a[n-1]~a[m-1]a[0]
//垂直 a[m-1][0]~a[1]a[0]
//水平 a[1]a[0]~a[1]a[n-2]
for (int j = 0; j < n; j++)
{
numm[0][j] = a[i];
i++;
}
for (int j = 1; j < m - 2; j++)
{
numm[j][n - 1] = a[i];
i++;
}
for (int j = n - 1; j >= 0; j--)
{
numm[m - 1][j] = a[i];
i++;
}
for (int j = m - 2; j > 0; j--)
{
numm[j][0] = a[i];
i++;
}
//第二次循环
for (int j = 1; j < n-1; j++)
{
numm[1][j] = a[i];
i++;
}
for (int j = 2; j < m - 3; j++)
{
numm[j][n - 2] = a[i];
i++;
}
for (int j = n - 2; j >= 1; j--)
{
numm[m - 2][j] = a[i];
i++;
}
for (int j = m - 3; j > 1; j--)
{
numm[j][1] = a[i];
i++;
}
#include
#include
#include
#include
using namespace std;
//排序函数
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
int N;
cin >> N;
int m=0, n=0;
//输入并存储N个数
vector a(N);
for (int i = 0; i < N; i++)
{
cin >> a[i];
}
//数字降序排序
sort(a.begin(), a.end(), cmp);
//找出行m,列n
for (int i = 1; i * i <= N; i++)
{
if (N % i == 0) //找到小于根号N的能整除N的最大的数,该数就是列
{
n = i;
m = N / n;
}
}
//vector存储一行的数字vector(n)(行容器)
//vector存储m个行容器
vector> numm(m,vector(n));
//对应数组某行某列的数字 numm[i][j]
int r = 0; //第几次循环
int i = 0; //遍历到数列的第i个数字
while (r < m / 2+m%2 ) //循环次数为m / 2+m%2
{
for (int j = r; j < n - r&&i= r && i < N; j--)
{
numm[m - 1 - r][j] = a[i];
i++;
}
for (int j = m - 2 - r; j > r && i < N; j--)
{
numm[j][r] = a[i];
i++;
}
r++;
}
//输出矩阵
for (int h = 0; h < m; h++)
{
for (int l = 0; l < n; l++)
{
if (l != n - 1)
cout << numm[h][l] << " ";
else
cout << numm[h][l] << endl;
}
}
return 0;
}