题解 | #Repeater#
Repeater
http://www.nowcoder.com/practice/97fd3a67eff4455ea3f4d179d6467de9
#include<string>
#include<math.h>
using namespace std;
char result[3000][3000];
// temple为模板,n为模板大小,scale为规模,pos:起始行数
void show(char temple[][6], int n, int scale, int pos_x, int pos_y){
if(scale == 1){
// 输出模板
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
result[pos_x+i][pos_y+j] = temple[i][j];
}else{
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if(temple[i][j] != ' ')
show(temple, n, scale-1, pos_x+int(i*pow(n,(scale-1))), pos_y+int(j*pow(n,(scale-1))));
}
}
}
}
void showResult(int n[], int scale[], int count){
int pos_x=0,pos_y=0;
for(int i=0; i<count; i++){
for(int j=0; j<pow(n[i],scale[i]); j++){
for(int k=0; k<pow(n[i],scale[i]); k++){
cout << result[pos_x+j][k];
}
cout << endl;
}
pos_x += int(pow(n[i],scale[i]));
}
}
// 用递归
int main(){
int n[100]; // 模板大小n[i]*n[i]
int scale[100]; // 放大倍数
char temple[100][6][6]; // 最大5x5
int count=0; // 图案个数
int i,j;
for(i=0; i<3000; i++){
for(j=0; j<3000; j++){
result[i][j] = ' ';
}
}
cin >> n[count++];
while(n[count-1] != 0){
for(int i=0; i<n[count-1]; i++){
char temp[6];
cin.get(); // 先吸收回车
cin.get(temp,n[count-1]+1);
for(int j=0; j<n[count-1]; j++){
temple[count-1][i][j] = temp[j];
}
}
cin >> scale[count-1];
cin >> n[count++];
}
count--; // 减去最后那个0
int pos=0;
show(temple[0], n[0], scale[0], pos, 0);
for(int i=1;i<count;i++){
pos += int(pow(n[i-1],scale[i-1])); // 下一个的起始位置
show(temple[i], n[i], scale[i], pos, 0); // 行、列
}
showResult(n, scale, count);
return 0;
}