【PAT】【C++】10050.螺旋矩阵

题目 :本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 mn 列,满足条件:m×n 等于 Nmn;且 mn 取所有可能值中的最小值。

输入格式

输入在第 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

找规律

//对于整个矩阵,每次循环确定一圈的数字
//第一次循环,找规律,可以看出,每次循环确定的元素位置随循环次数有规律变动
//m行n列 a[m][n]
//数字从大到小排序
//水平 a[0][0]~a[0][n-1]
//垂直 a[0][n-1]~a[m-1]a[n-1]
//水平 a[m-1]a[n-1]~a[m-1]a[0]
//垂直 a[m-1][0]~a[1]a[0]
//水平 a[1]a[0]~a[1]a[n-2]
for (int j = 0; j < n; j++)
{
	numm[0][j] = a[i];
	i++;
}
for (int j = 1; j < m - 2; j++)
{
	numm[j][n - 1] = a[i];
	i++;
}
		
for (int j = n - 1; j >= 0; j--)
{
	numm[m - 1][j] = a[i];
	i++;
}

for (int j = m - 2; j > 0; j--)
{
	numm[j][0] = a[i];
	i++;
}


//第二次循环
for (int j = 1; j < n-1; j++)
{
	numm[1][j] = a[i];
	i++;
}
for (int j = 2; j < m - 3; j++)
{
	numm[j][n - 2] = a[i];
	i++;
}

for (int j = n - 2; j >= 1; j--)
{
	numm[m - 2][j] = a[i];
	i++;
}

for (int j = m - 3; j > 1; j--)
{
	numm[j][1] = a[i];
	i++;
}
#include
#include
#include
#include
using namespace std;

//排序函数
bool cmp(int a, int b)
{
	return a > b;
}

int main()
{
	int N;
	cin >> N;
	int m=0, n=0;

	//输入并存储N个数
	vector a(N);
	for (int i = 0; i < N; i++)
	{
		cin >> a[i];
	}
	
	//数字降序排序
	sort(a.begin(), a.end(), cmp);

	//找出行m,列n
	for (int i = 1; i * i <= N; i++)
	{
		if (N % i == 0)  //找到小于根号N的能整除N的最大的数,该数就是列
		{
			n = i;
			m = N / n;
		}		
	}

	//vector存储一行的数字vector(n)(行容器)
	
	//vector存储m个行容器
	vector> numm(m,vector(n));
	//对应数组某行某列的数字 numm[i][j]

	int r = 0;  //第几次循环
	int i = 0; //遍历到数列的第i个数字
	while (r < m / 2+m%2 ) //循环次数为m / 2+m%2
	{
		for (int j = r; j < n - r&&i= r && i < N; j--)
		{
			numm[m - 1 - r][j] = a[i];
			i++;
		}
		for (int j = m - 2 - r; j > r && i < N; j--)
		{
			numm[j][r] = a[i];
			i++;
		}
		r++;
	}

	//输出矩阵
	for (int h = 0; h < m; h++)
	{
		for (int l = 0; l < n; l++)
		{
			if (l != n - 1)
				cout << numm[h][l] << " ";
			else
				cout << numm[h][l] << endl;
		}
	}
	return 0;
}

你可能感兴趣的:(PAT,C++,算法)