[题目链接](Repeater_牛客题霸_牛客网 (nowcoder.com))
1.题目分析
输入:要求第一行为N,使基本图形为N*N(N只能是3,4,5),第二行为基本图形,第三行为重复的比例级别。
用一个二维数组来存储基本图形,之后遍历图形,level从0开始,遇到字符就用基本图形去填充结果,遇到空格就用len*len个空格(len与=n的level次方)去填充,循环一次更新结果,使结果作为新的模板,直到level达到输入的要求。
2.代码实现
#include <iostream>
#include <cmath>
#include<string>
using namespace std;
char pic[6][6];
char element[3000][3000];//重复的基本图形
char res[3000][3000];//最终结果
void Space(char res[][3000], char element[][3000], char pic[][6], int len, int row, int col) {
for (int i = row; i < row + len; i++) {
for (int j = col; j < col + len; j++) {
res[i][j] = ' ';
}
}
}
void Update(char res[][3000], char element[][3000], char pic[][6], int len, int row, int col) {
for (int i = row; i < row + len; i++) {
for (int j = col; j < col + len; j++) {
res[i][j] = element[i - row][j - col];
}
}
}
int main() {
int n, level, len;
// printf("请输入N\n");
while (cin >> n) {
cin.get();//前面的在读取输入时会在缓冲区中留下一个字符'\n',
//所以如果不在此加一个getchar()把这个回车符取走的话,getline()就不会等待从键盘键入字符,
//而是会直接取走这个回车符,从而导致读取有误;
//printf("请输入图形\n");
for (int i = 0; i < n; i++) {
cin.getline(pic[i], n + 1);
}
// printf("请输入level\n");
cin >> level;
for (int a = 0; a < level; a++) {
len = pow(n, a);
//边界条件
if (len == 1) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
element[i][j] = pic[i][j];
res[i][j] = element[i][j];
}
}
}
//更新结果
else {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (pic[i][j] != ' ') {
Update(res, element, pic, len, i * len, j * len);
}
else {
Space(res, element, pic, len, i * len, j * len);
}
}
}
}
//更新模板
for (int i = 0; i < n * len; i++) {
for (int j = 0; j < n * len; j++) {
element[i][j] = res[i][j];
}
}
}
//输出结果
for (int i = 0; i < n * len; i++) {
for (int j = 0; j < n * len; j++) {
cout << res[i][j];
}
cout << endl;
}
}
return 0;
}
3.要点记录
这题做了好久,更新模板和更新结果那里绕晕了,同时也要注意读入字符时缓冲区的状态,如果有一个换行符,要用getchar()先取走