本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。
输入格式: 输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。
输出格式: 输出螺旋矩阵。每行n个数字,共m行。相邻数字以1个空格分隔,行末不得有多余空格。
程序:
#include <iostream> #include <cmath> #include <algorithm> using namespace std; int cmp(int a, int b) { return a > b; } int ifBreak(int a, int n) { if (a == n) return 1; return 0; } int main() { int N, n, m; cin >> N; for (m = (int)sqrt(N); m >= 1; m--) if (N % m == 0) break; n = N / m; // 将数组非递增排序 int temp[N]; for (int k = 0; k < N; k++) cin >> temp[k]; sort(temp, temp + N, cmp); int Arr[n][m]; // 保存结果数组 int counter = 0; // 用于计数来中断while循环 int start = 0; // 设定起始值 int i, j; while (counter <= N) { for (j = start; j <= m - 1 - start; j++) { if (ifBreak(counter, N)) break; Arr[start][j] = temp[counter]; counter++; } j--; // 这里之所以这么写是因为j不自减的话就溢出了,下同 for (i = start + 1; i <= n - 1 - start; i++) { if (ifBreak(counter, N)) break; Arr[i][j] = temp[counter]; counter++; } i--; for (j = j - 1; j >= start; j--) { if (ifBreak(counter, N)) break; Arr[i][j] = temp[counter]; counter++; } j++; for (i = i - 1; i >= start + 1; i--) { if (ifBreak(counter, N)) break; Arr[i][j] = temp[counter]; counter++; } i++; if (counter == N) { break; } start++; } // 打印结果数组 int nn, mm; for (nn = 0; nn < n; nn++) { cout << Arr[nn][0]; for (mm = 1; mm < m; mm++) cout << " " << Arr[nn][mm]; cout << endl; } return 0; }