#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
/*
解题思路:
1、找出需要拼接的整体花砖的个数q=m/n
2、找出剩余拼接的边长p=m%n,则两边需要增加的长度分别为x=p/2,因为花砖边长只能按照单位1分割,故此处的余量p只能为偶数
3、若p为偶数则直接计算;若p为奇数,则p=p+n(即需要将一块花砖的边长加原始余量),同时q=q-1(需要的整体花砖少一个)
4、平分余量,则x+q*n+x=m;
5、构造需要输出的拼接结果,按行打印出即可
*/
void pingjie()
{
int n=0,m=0;
cin>>n>>m;
vector<string> vn;
vector<vector<char> > vm;
string str="";
for(int i=0; i<n; i++)
{
cin>>str;
vn.push_back(str);
}
///m是n的整数倍,直接输出
///m除以n余数为奇数偶数时的判断
int p,q;
p = m%n;
q = m/n;
if(1 == p%2)
{
p = p+n;
q = (m-n)/n;
}
///两边多出的为p/2
int x = p/2;
int ex = n-x;
//cout<<p<<x<<q<<endl;
int number=0;
///(n-x)——n行的数据
for(int i=ex; i<n; i++)
{
number++;
vector<char> temp;
for(int j=ex; j<n; j++)
temp.push_back(vn[i][j]);
int y=0;
while(y<q)
{
y++;
for(int k=0; k<n; k++)
temp.push_back(vn[i][k]);
}
for(int j=0; j<x; j++)
temp.push_back(vn[i][j]);
vm.push_back(temp);
}
///中间的q倍的0——n行的数据
int y=0;
while(y<q)
{
y++;
//cout<<"______test________"<<endl;
for(int i=0; i<n; i++)
{
number++;
vector<char> temp;
for(int j=ex; j<n; j++)
temp.push_back(vn[i][j]);
for(int k=0; k<n; k++)
temp.push_back(vn[i][k]);
for(int j=0; j<x; j++)
temp.push_back(vn[i][j]);
vm.push_back(temp);
}
}
///0——x行的数据
for(int i=0; i<x; i++)
{
number++;
vector<char> temp;
for(int j=ex; j<n; j++)
temp.push_back(vn[i][j]);
int y=0;
while(y<q)
{
y++;
for(int k=0; k<n; k++)
temp.push_back(vn[i][k]);
}
for(int j=0; j<x; j++)
temp.push_back(vn[i][j]);
vm.push_back(temp);
}
//cout<<number<<endl;
for(int i=0; i<number; i++)
{
for(int j=0; j<number; j++)
cout<<vm[i][j];
cout<<endl;
}
cout<<endl;
}
int main()
{
int T;
cin>>T;
while(T--)
pingjie();
//cout << "Hello world!" << endl;
return 0;
}
/**
测试数据:
3
3 5
1x1
xox
1x1
3 7
1x1
xox
1x1
5 7
13s31
lkckl
sc2cs
lkckl
13s31
测试结果:
11x11
11x11
xxoxx
11x11
11x11
oxxoxxo
x11x11x
x11x11x
oxxoxxo
x11x11x
x11x11x
oxxoxxo
113s311
113s311
llkckll
ssc2css
llkckll
113s311
113s311
*/
2018网易互娱笔试1——花砖拼接C++
最新推荐文章于 2021-12-29 11:05:36 发布