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()先取走