本题要求将给定的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
解:
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++)
a[i] = in.nextInt();
int x = 0;
int y = 0;
int min = 99999;
int gen = (int) Math.sqrt(n);
for (int i = 1; i <= gen; i++)// 获得二维矩阵的长和宽
for (int j = n; j >= gen; j--)
if (i * j == n && j - i < min) {
x = j;
y = i;
}
int[][] b = new int[x][y];
Arrays.sort(a);
int p = 0;
int q = 0;
int num = n - 2;
b[p][q] = a[n - 1];
while (num >= 0) {
while (q + 1 < y && b[p][q + 1] == 0) {// 向右走
q++;
b[p][q] = a[num];
num--;
}
while (p + 1 < x && b[p + 1][q] == 0) {// 向下走
p++;
b[p][q] = a[num];
num--;
}
while (q - 1 >= 0 && b[p][q - 1] == 0) {// 向左走
q--;
b[p][q] = a[num];
num--;
}
while (p - 1 >= 0 && b[p - 1][q] == 0) {// 向上走
p--;
b[p][q] = a[num];
num--;
}
}
for (int i = 0; i < x; i++) {
if (i != 0)
System.out.println();
System.out.print(b[i][0]);
for (int j = 1; j < y; j++)
System.out.print(" " + b[i][j]);
}
}
}