题目
由数组a生成数组b的方法描述如下:
1) 将一维整数数组a中的n个元素(n<=300)依次分割出若干个数据块,每个数据块有m×m个元素,m 最大值为8,最小值为2。分割时,按尽可能大的数据块进行分割;
2) 对每个分割出的数据块用“方阵转换法”进行转换,每次转换后得到的数据块依次存储在数据b中;
3) 数组 a 分割后的剩余元素(个数小于4),直接依序存储到数组b中。
例如n=140时,可依次分割出3个数据块,元素的个数分别为64(8×8)、64(8×8)、9(3×3),剩余元素为3个。
“方阵转换法”过程如下:将数据块中m×m个元素按行序排列成一个数字方阵,从该数字方阵中按列序得到转换后元素的次序。以3×3数据块为例,转换过程如下图所示:
输入
第一行是正整数n,表示数据个数。
第二行是n个用空格隔开的正整数(n<=300)。
输出
经过方阵转换后数列,两数间用空格隔开。
输入样例
12
12 67 34 42 19 77 54 22 83 13 89 52
输出样例12 42 54 67 19 22 34 77 83 13 89 52
题解
#include <iostream>
using namespace std;
void fg(int num,int p);//定义递归函数
int a[1000],n;
int main()
{
int num;
cin >> n;
for (int i=1;i<=n;i++)
{
cin >> a[i];
}
fg(n,1);
return 0;
}
void fg(int num,int p)//num是剩下未转制的元素个数,p是第一个未转制元素的下标
{
if (num<4)
{
for (int i=p;i<=n;i++) cout << a[i] << " ";//当剩余元素小于2^2时,直接输出
return;
}
for (int i=8;i>=2;i--)
{
if (i*i<=num)//求出小于num的最大完全平方数
{
int arr[100][100]={};//新建数组
for (int j=1;j<=i;j++)
for (int k=1;k<=i;k++)
{
arr[j][k]=a[p+i*(j-1)+k-1];//转制
}
for (int j=1;j<=i;j++)
{
for (int k=1;k<=i;k++)
{
cout << arr[k][j] << " ";//输出
}
}
//改变变量
num-=i*i;
p+=i*i;
break;
}
}
fg(num,p);//递归
}