PAT_B_1050_螺旋矩陣

題目描述:spa

本題要求將給定的 N 個正整數按非遞增的順序,填入「螺旋矩陣」。所謂「螺旋矩陣」,是指從左上角第 1 個格子開始,按順時針螺旋方向填充。要求矩陣的規模爲 m 行 n 列,知足條件:m×n 等於 N;m≥n;且 m−n 取全部可能值中的最小值。
輸入格式:
輸入在第 1 行中給出一個正整數 N,第 2 行給出 N 個待填充的正整數。全部數字不超過 10
​4​​ ,相鄰數字以空格分隔。
輸出格式:
輸出螺旋矩陣。每行 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

本人AC代碼:blog

// PAT_1050_螺旋數

# include <stdio.h>
# include <math.h>
# include <stdlib.h>
# include <algorithm>
# define Max_Size 10010
# define Min_Size 100
using namespace std;

int Get_n(float N)
{
	int i;

	for (i=(int)sqrt(N);i>0; i--)
	{
		if ((int)N%i == 0)
			return i;
	}
}
int main(void)
{
	int N;
	int i, j, k;

	int m, n;
	scanf("%d",&N);
	n = Get_n(N);
	m = N/n;

	int A[N+10];
	int B[m+1][n+1];

	// 初始化
	for (i=0; i<m; i++)
	{
		for (j=0; j<n; j++)
		{
			B[i][j] = 0;
		}
	}

	for (i=0; i<N; i++)
	{
		scanf("%d",&A[i]);
	}
	sort(A,A+N); // 排序

	// 開始放入 m行n列中去
	i=0; j=0; k=N-1;
	B[i][j] = A[k--];
	while (k>=0)
	{
		// 向右走
		while (!B[i][j+1] && j+1<n )
		{
			B[i][++j] = A[k--];
		}
		// 向下走
		while (!B[i+1][j] && i+1<m )
		{
			B[++i][j] = A[k--];
		}
		// 向左走
		while (!B[i][j-1] && j-1>=0)
		{
			B[i][--j] = A[k--];
		}
		// 向左走
		while (!B[i-1][j] && i-1>=0)
		{
			B[--i][j] = A[k--];
		}
	}

	for (i=0; i<m; i++)
	{
		for (j=0; j<n; j++)
		{
			printf("%d",B[i][j]);
				if (j<n-1)
					printf(" ");
		}
		printf("\n");
	}
	return 0;
}

RRR  排序

相關文章
相關標籤/搜索