#include<iostream> #include<cstdio> #include<math.h> #include<string> using namespace std; char templat [6][6]; //初始模版: char m2[3000][3000];// new template char result[3000][3000]; int len; // new the size of matrix int n,q; // input n and q level void update(int x,int y,bool flag) { // len 应该是此时(模版)的大小 for (int i = 0;i < len; i++){ for (int j = 0; j < len; j++){ if (flag) result [x+i][y+j] = m2[i][j]; // 每次更新一个模版大小的图形 else result [x+i][y+j] = ' '; } } } int main(){ while(cin >> n){ // input and output is not in same buffer so,every time you can output the result array; if(n == 0) break; //2.前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完s[i]的值后按回车键所致), //所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符, //而是会直接取走这个“无用的”回车符,从而导致读取有误; cin.get(); // take the \n for(int i=0;i<n;i++){ //读入整行数据,它使用回车键输入的换行符来确定输入结尾。 //调用方法: cin.getline(str (字符数组), len); // 获取输入方法2: // string temp; // getline(cin,temp); // for (int j = 0; j < temp.size(); j++) // templat[i][j] = temp[j]; cin.getline(templat[i],6); // 获取输入方法1 } scanf("%d",&q); for(int k=0;k<q;k++){ len = pow(n,k); // first level: if(len == 1){ // 边界条件 如果是k就是0,如果是len就是1 for (int i = 0; i < n; i++) for(int j=0;j<n;j++){ m2[i][j] = templat[i][j]; result[i][j] = m2[i][j]; } } else{ // 1.分析模版,按照初始模版来替换 for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ if (templat[i][j]==' ') update(i*len,j*len,false); else update(i*len,j*len,true); } } // 3. 交换 此时的 模版和结果: for (int i = 0; i < len*n; i++){ for (int j = 0; j < len*n; j++) m2[i][j] = result[i][j]; } } } //输出 len = pow(n,q); for (int i = 0; i < len; i++) { for (int j = 0; j < len; j++) cout << result[i][j]; cout << endl; } } return 0; }