虽然说是25分的题,而且是最后一道,但是还是很简单的,毕竟是乙级嘛。网了也有一些答案,不过方法都挺复杂,我的这方法思路比较简单。很容易理解。
本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。
int **Too(int x, int y, int num[]);
int* fun(int N){
int *a ;
a = new int[3];
int m = 0, n = 0,x,y;
int tmp = N;
for (n = 1; n <= N; ++n){
for (m = n; m <= N; ++m){
if (m*n == N){
if (m - n < tmp){
tmp = m - n;
y= m;
x= n;
}
}
}
}
a[0] = y; a[1] =x;
return a;
}
void PAT1050(){
//求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。
int num[12] = { 37, 76, 20, 98 ,76, 42, 53, 95, 60, 81, 58, 93 };
int N = 12,x,y,k=0;
int *tmp;
tmp = fun(N);
x = tmp[1]; y = tmp[0];
sort(num, num + 12);
reverse(num, num + 12);
int **a;
a = Too(x, y, num);
for (int i = 0; i < y; ++i){
for (int j = 0; j < x; ++j){
cout << setw(3) << a[i][j];
}
cout << endl;
}
}
int **Too(int x, int y, int num[]){
int **mat;
mat = new int*[y];
for (int i = 0; i < y; ++i){
mat[i] = new int[x];
}
int i, j, k = 0, m;
if (x % 2 == 0)m = x / 2;
else m = x / 2 + 1;
for (i = 0; i < m; ++i){
for (j = i; j<x - i; j++)
{
mat[i][j] = num[k++];
}
for (j = i + 1; j<y - i; j++)
{
mat[j][x - i - 1] = num[k++];
}
for (j = x - i - 2; j >= i; j--)
{
mat[y - i - 1][j] = num[k++];
}
for (j = y - i - 2; j >= i + 1; j--)
{
mat[j][i] = num[k++];
}
}
return mat;
}