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;
}


猜你喜欢

转载自blog.csdn.net/sinat_37273780/article/details/56489308