1. 程式人生 > >PAT乙級1050 螺旋矩陣

PAT乙級1050 螺旋矩陣

1050. 螺旋矩陣(25)

時間限制 150 ms
記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 CHEN, Yue

本題要求將給定的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
 
  
 
  

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define size 10010
int num[size] = { '\0' }; int comp(const void*a, const void*b);

int aim[size][size] = { '\0' };
int main(void)
{
	int sum = 0;
	scanf("%d", &sum);

	for (int i = 0; i < sum; i++)
{
		scanf("%d", &num[i]);
	}
	qsort(num, sum, sizeof(int), comp);
	int line = 0, row = 0;
	line = (int)sqrt(sum);
	row = line;
	int mem = line;

	while ((line*row) != sum) {
		while ((line*row)< sum && (line&&row) != sum) {
			line++;
		}
		if (line*row == sum)
			break;
		row--;
		line = mem;
	}
	
	int i, j;
	int count = 0;
	aim[j = 1][i = 1] = num[count++];

	while (count < sum)
	{
		while (i < row&&aim[j][i + 1] == '\0')
		{
			aim[j][++i] = num[count++];
		}
		while (j < line&&aim[j + 1][i] == '\0')
		{
			aim[++j][i] = num[count++];
		}
		while (i >1 && aim[j][i - 1] == '\0')
		{
			aim[j][--i] = num[count++];
		}
		while (j > 1 && aim[j - 1][i] == '\0')
		{
			aim[--j][i] = num[count++];
		}
	}
	for (int i = 1; i <= line; i++)
	{
		int pause = 1;
		for (int k = 1; k <= row; k++)
		{
			if (pause)
			{
				pause = 0;
			}
			else
			{
				printf(" ");
			}
			printf("%d", aim[i][k]);
		}
		printf("\n");
	}

	return 0;
}

int comp(const void * a, const void * b)
{
	return *(int*)b - *(int *)a;
}