The input contains multiple test cases. The first line of each case is an integer N, representing the size of the template is N*N (N could only be 3, 4 or 5). Next N lines describe the template. The following line contains an integer Q, which is the Scale Level of the picture. Input is ended with a case of N=0. It is guaranteed that the size of one picture will not exceed 3000*3000.
For each test case, just print the Level Q picture by using the given template.
3 # # # # # 1 3 # # # # # 3 4 OO O O O O OO 2 0
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # OO OO O OO O O OO O OO OO OO OO O O O O O O O O OO OO OO OO O O O O O O O O OO OO OO OO O OO O O OO O OO OO
try: while True: num = int(input()) if num == 0:break result = [] #输出结果 template = [] #起初模板(不变) for i in range(num): template.append(input()) result.append(template[i]) sign = result[0].split()[0][0] #得到符号 zoomsNum = int(input()) for i in range(1,zoomsNum): #i为放大的倍数 replaceNum = num**i example = [] #保存着前一个倍数的模板 blanks = " "*replaceNum #当前倍数比较起初模板空格被放大的倍数 for j in range(num): #j为起初模板对于的行 for k in range(replaceNum): #k是对应起初模板的一行中被放大倍数后的行数 if j == 0: example.append(result[k]) #保存着前一个倍数的模板 result[k] = template[j].replace(" ",blanks) #在起初第一行模板不需要增加行数,所以只需要放大空格和符号sign就好 else: result.append(template[j].replace(' ',blanks)) signLines = example[k] #把每一个符号位替换成上一个倍数对应的行 result[k+j*replaceNum] = result[k+j*replaceNum].replace(sign,signLines) for i in result: print(i) except Exception: pass
#include <bits/stdc++.h> using namespace std; char base[5][5]; char mm[3000][3000]; int N,Q; char w;//用来记录所用的特殊符号 struct point{ int x,y; point(int a,int b):x(a),y(b){} }; vector<point>mybase;//将坐标中心放到中心,而不是从左上角开始,存到这里,只记录符号w struct point2{ double x,y; point2(double a,double b):x(a),y(b){} }; vector<point2>mybase2;//这个主要用于将奇数偶数计算中心的方法合并,只能用小数来算, //不然形状就不是从中心发展(偶数情况) void draw(int x,int y,int level){ if(level==1){//level==1,直接将对应位置为w for(int i=0;i<mybase.size();i++) { mm[x+mybase[i].x][y+mybase[i].y]=w; } } else { //如果不是level1 ,就递归往下画 for(int i=0;i<mybase.size();i++){ draw(int(mybase2[i].x*pow(N,level-1)+x),int(mybase2[i].y*pow(N,level-1)+y),level-1); } } } void show(int x,int y,int level){ //画的是N^level*N^level 的矩阵,找到其左上角和右下角的坐标 int xlow,ylow,xhigh,yhigh; if(N%2==1){ // n为奇数 xlow=x-pow(N,level)/2+1; ylow=y-pow(N,level)/2+1; xhigh=x+pow(N,level)/2; yhigh=y+pow(N,level)/2; } else{ xlow=x-pow(N,level)/2; ylow=y-pow(N,level)/2; xhigh=x+pow(N,level)/2-1; yhigh=y+pow(N,level)/2-1; } for(int i=xlow;i<=xhigh;i++){ for(int j=ylow;j<=yhigh;j++){ cout<<mm[i][j]; } cout<<endl; } } int main(){ freopen("in.txt","r",stdin); while(scanf("%d",&N)!=EOF&&N){ memset(base,' ',sizeof(base)); memset(mm,' ',sizeof(mm)); mybase.clear(); mybase2.clear(); int cx=N/2; int cy=N/2; double dcx=(N-1)/2.0; double dcy=dcx; getchar();//吸收换行符 for(int i=0;i<N;i++){ gets(base[i]); for(int j=0;j<N;j++){ if(base[i][j]!=' '){ mybase.push_back(point(i-cx,j-cy)); mybase2.push_back(point2(i-dcx,j-dcy)); w=base[i][j]; } } } cin>>Q; draw(1500,1500,Q); show(1500,1500,Q); } return 0; }
while True: try: N=int(input()) if N==0: break s=[] #s为最后输出结果 sta=[] #sta列表储存被替换字符串的模板,长度恒为N,即输入N后的N行 for n in range(N): s.append(input()) sta.append(s[n]) for c in s[0]:#找到特殊字符 if c != ' ': ch=c break Q=int(input()) lines=N**Q for i in range(1,Q):#eg: 3(N)^3(Q) 分解为 3*9 替换 Len=N**i '''每次替换总行数 Q=2时仅循环一次(i=1),替换N行, Q=3时最后一次循环(i=2)替换N^2行''' ex=[] '''ex列表储存替换字符串的模板 eg:Q=3时最后一次(i=2),ex有9个元素 先找到sta[0]中的空格,将其替换成最后输出N^(Q-1)个空格 再将上述得到的字符串中出现的特殊字符(eg:'#')换为ex[0] 得到s[0],如此循环N^(Q-1)遍 再找到sta[1]中的空格,……以此类推 sta[N-1]…… 得到s[N^Q],即N*N^(Q-1) ''' str0="" for h in range(Len): str0+=' '#生成一个字符串,包含Len个空格 for j in range(N): for k in range(Len): if j==0: ex.append(s[k]) s[k]=sta[j].replace(' ',str0) else: s.append(sta[j].replace(' ',str0)) str1=ex[k] s[k+j*Len]=s[k+j*Len].replace(ch,str1) for l in range(lines):#s(最后输出结果),有N^Q行 print(s[l]) except: break
#include<iostream> using namespace std; #include<cmath> #include<vector> char picture[6][6]; int n; int Q; void draw(vector<vector<char>> v) { for (vector<vector<char>>::iterator it=v.begin();it!=v.end();it++) { for (vector<char>::iterator itx = (*it).begin(); itx != (*it).end(); itx++) { cout << *itx; } cout << endl; } } void showPicture(int n, char p[][6], int m, vector<vector<char>> &v) { static int start1 = 0; static int start2 = 0; int begin1 = start1; int begin2 = start2; if (m == 1) { for (int i1 = start2,i2=0; i1 < start2+n,i2 < n; i1++,i2++) { for (int j1 = start1,j2=0; j1 < start1+n,j2 < n; j1++,j2++) { v[i1][j1] = p[i2][j2]; } } } else { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (p[i][j] != 32) { showPicture(n, p, m - 1,v); } start1 += pow(n,m-1); } start1 = begin1; start2 += pow(n,m-1); } start2 = begin2; } } int main() { n = 1; Q = 1; while (n) { cin >> n; cin.ignore();//跳过回车 for (int i = 0; i < n; i++) { cin.getline(picture[i], 6); } cin >> Q; vector<vector<char>> v(pow(n, Q), vector<char>(pow(n, Q), ' ')); showPicture(n,picture,Q,v); draw(v); v.clear(); } return 0; }
#include<iostream> using namespace std; int main(){ int N,Q; char res[1000][1000]; while(cin>>N){ getchar(); if(N==0) return 0; else{ for(int i=0;i<N;i++){ if(!cin.getline(res[i],N+1)) cout << "error" << endl; } char src[N][N]; for(int i=0;i<N;i++) for(int j=0;j<N;j++) src[i][j]=res[i][j]; //src作为输入图案进行比对,将迭代结果输出到res中 bool flag=0; if(res[0][0]==' ') //flag用来标识首字符是否为空格 flag=1; cin>>Q; int bound=N; for(int i=1;i<=Q;i++){ //i表示迭代次数=当前规模 //基础图案的每个字非空格符映射一个新的基础图案,空格则映射为基础图案大小的空格(取左上角区域为基础图案) for(int j=0;j<N;j++){ for(int k=0;k<N;k++){ if(src[j][k]!=' '||(flag==1&&j==0&&k==0)){ //对于基础图案的字符,若其不是空格或者首字符为空格,则将其映射 int a=0; for(int l=j*bound;l<(j+1)*bound;l++){ int b=0; for(int m=k*bound;m<(k+1)*bound;m++){ res[l][m]=res[a][b]; //二维数组左上角区域作为基础图案 b++; } a++; } if(flag&&i>1&&!(j==0&&k==0)){ //对于首个字符为空格的基础图案,除第一个外,将所有基础图案的左上角变成空格(保留第一个用于下次迭代) for(int l=j*bound;l<j*bound+bound/N;l++){ for(int m=k*bound;m<k*bound+bound/N;m++){ res[l][m]=' '; } } } } else{ int a=0; for(int l=j*bound;l<(j+1)*bound;l++){ int b=0; for(int m=k*bound;m<(k+1)*bound;m++){ res[l][m]=' '; b++; } a++; } } } } if(flag){ //若首字符为空格,每次迭代都将其左上角区域还原成空格,以保持下轮外层迭代的基础图案正确 for(int l=0;l<bound/N;l++){ for(int m=0;m<bound/N;m++){ res[l][m]=' '; } } } bound*=N; } for(int i=0;i<bound/N;i++){ //输出迭代后图案 for(int j=0;j<bound/N;j++) cout<<res[i][j]; cout<<endl; } } } }
#include <iostream> #include <cstdio> #include <cmath> #include <string.h> using namespace std; char map[3003][3003]; char str[6][6]; int n; void dfs(int m, int x, int y){ if (m == 1){ for (int i = 0; i<n; i++) for (int j = 0; j<n; j++) map[x + i][y + j] = str[i][j]; return; } int size = (int)pow(n*1.0, m - 1); for (int i = 0; i<n; i++){ for (int j = 0; j<n; j++){ if (str[i][j] != ' ') dfs(m - 1, x + i*size, y + j*size); } } } int main(void){ n = 1; while (n){ cin >> n; getchar(); for (int i = 0; i < n; i++){ cin.getline(str[i],6); } int m; cin >> m; int size = (int)pow(n*1.0, m); for (int i = 0; i<size; i++){ for (int j = 0; j<size; j++) map[i][j] = ' '; map[i][size] = '\0'; } dfs(m, 0, 0); for (int i = 0; i<size; i++) cout<<map[i]<<endl; } return 0; }
#include<iostream> (720)#include<cstdio> #include<string> using namespace std; int n; //原始模板大小 int len; //现在模板大小 char model[6][6]; //原始模板 char m1[3000][3000]; //保存现在的模板 char m2[3000][3000]; //保存新产生的模板 void change(int x, int y, int flag) //x y 为现在的起点 1的时候用现有模板填充 0的时候用空格 { for (int i = 0; i < len; i++) for (int j = 0; j < len; j++) { if (flag) m2[i + x][j + y] = m1[i][j]; else m2[i + x][j + y] = ' '; } } void deal() //根据原始模板决定是否替换 { for(int i=0;i<n;i++) for (int j = 0; j < n; j++) { if (model[i][j] != ' ') change(i*len, j*len, 1); //用现有模板替换 else change(i*len, j*len, 0); } } void getnew() //更新现在的模板 { for (int i = 0; i < len * n; i++) for (int j = 0; j < len * n; j++) m1[i][j] = m2[i][j]; } int main() { while (cin >> n) { getchar(); //吃掉回车 if (n == 0) break; for (int i = 0; i < n; i++) { string temp; getline(cin,temp); for (int j = 0; j < temp.size(); j++) model[i][j] = temp[j]; } int num; cin >> num; //接收输入结束 //产生现有的模板 for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) m1[i][j] = model[i][j]; //开始用现有模板替代原有的元素 for (int k = 1; k < num; k++) { len = pow(n,k); //现在模板的大小 deal(); getnew(); } //输出 len = pow(n,num); for (int i = 0; i < len; i++) { for (int j = 0; j < len; j++) if (num == 1) cout << m1[i][j]; else cout << m2[i][j]; cout << endl; } } return 0; }
/** 参考高赞的回答,适当的加了一些解释 题解思路:通过dfs找到每一个子图的左上角的起始点,然后在每一个元图像上面作画。 */ #include <iostream> #include <math.h> using namespace std; char str[6][6]; char map[3001][3001]; int n; int IntPow(int x,int n){ int ans=1; for(int i=1;i<=n;i++) ans*=x; return ans; } void dfs(int x,int y,int level){//x,y为子图形的左上角起始点 if(level==1){//搜索到了基础图形级别 for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ map[x+i][y+j]=str[i][j]; } } return; } int Size = IntPow(n,level-1); for(int i=0;i<n;i++){//搜索每一个位置对应的缩放的位置 for(int j=0;j<n;j++){ if(str[i][j]!=' ') dfs(x+i*Size,y+j*Size,level-1); } } } void dfs1(int m, int x, int y){ if (m == 1){ for (int i = 0; i<n; i++) for (int j = 0; j<n; j++) map[x + i][y + j] = str[i][j]; return; } int size = (int)pow(n*1.0, m - 1); for (int i = 0; i<n; i++){ for (int j = 0; j<n; j++){ if (str[i][j] != ' ') dfs1(m - 1, x + i*size, y + j*size); } } } int main() { int m; while(cin >> n){ if(n==0)break; getchar(); for (int i = 0; i < n; i++){ cin.getline(str[i],6); } int m; cin >> m; int size = (int)pow(n*1.0, m); for (int i = 0; i<size; i++){ for (int j = 0; j<size; j++) map[i][j] = ' '; map[i][size] = '\0'; } dfs(0,0,m); for(int i=0;i<size;i++){ cout<<map[i]<<endl; } } return 0; }
#include<iostream> (720)#include<math.h> using namespace std; char** fillOutput(char** temp, int n, int size, int q); int main() { int n, q; while (cin >> n) { if (n == 0) break; cin.ignore(); char** temp = new char* [n]; //创建二维数组temp存储template for (int i = 0; i < n; i++) { temp[i] = new char[n]; } for (int i = 0; i < n; i++) { //逐行读取template cin.getline(temp[i], n + (int)1); } cin >> q; int size = (int)pow(n, q); char** output = new char* [size]; for (int i = 0; i < n; i++) { output[i] = new char[size]; } output = fillOutput(temp, n, size, q); for (int i = 0; i < size; i++) { cout << output[i] << endl; } } return 0; } char** fillOutput(char** temp, int n, int size, int q) { if (q == 1) return temp; int lowSize = size / n; char** subMatrix = new char* [size]; for (int i = 0; i < size; i++) { subMatrix[i] = new char[size]; } for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { subMatrix[i][j] = ' '; } } for (int i = 0; i < n * lowSize; i += lowSize) { for (int j = 0; j < n * lowSize; j += lowSize) { if (temp[i / lowSize][j / lowSize] == ' ') continue; char** subsub = fillOutput( temp, n, lowSize, q - 1); for (int m = i; m < i + lowSize; m++) { for (int n = j; n < j + lowSize; n++) { subMatrix[m][n] = subsub[m - i][n - j]; } } } } return subMatrix; }
#include<iostream> #include<vector> #include <cmath> using namespace std; int N = 0; //ImageSpecification int n = 0; //MagnificationFactor vector <vector<char>>OriginalMatrix; vector <vector<char>>EnlargeMatrix; void DFS(int x, int y, int scale) {//OriginalMatrix做为元图像对EnlargeMatrix进行填充,每次填充从待填充位置的左上角(x,y)开始 if (scale == 1) { for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { EnlargeMatrix[i + x][j + y] = OriginalMatrix[i][j];//看作对坐标i,j进行偏移后的填充 } } return; } int second_scale = pow(N, scale - 1);//次级图像规模 for (int i = 0; i < N; i++) {//表明DFS次级图像填充原级图像的相对填充位置,递归降级 for (int j = 0; j < N; j++) { if (OriginalMatrix[i][j] != ' ') { DFS(x + i * second_scale, y + j * second_scale, scale - 1); } } } } int main() { while (cin >> N) { OriginalMatrix.clear(); OriginalMatrix.resize(N, vector<char>(N)); cin.ignore();//cin 默认情况下是以换行符 \n 作为输入结束的标志 for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { OriginalMatrix[i][j] = cin.get();//()中内容必须为字符变量,表示从输入流中读取到()变量中,如果()中没有内容,直接返回数据的值// } cin.ignore(); } cin >> n; EnlargeMatrix.clear(); EnlargeMatrix.resize((int)pow(N, n), vector<char>((int)pow(N, n))); for (int i = 0; i < (int)pow(N, n); ++i) {//先把待输出矩阵的元素全部填充为空格 for (int j = 0; j < (int)pow(N, n); ++j) { EnlargeMatrix[i][j] = ' '; } } DFS(0, 0, n); for (int i = 0; i < (int)pow(N, n); ++i) { for (int j = 0; j < (int)pow(N, n); ++j) { cout << EnlargeMatrix[i][j]; } cout << endl; } } }
#include<iostream> #include<vector> #include<cctype> #include<cmath> using namespace std; struct Point { int x, y; Point(int a, int b) : x(a), y(b){}; }; int main(void) { int n, time; // 模板大小、放大倍数 char str[6][6]; // 存储模板 while(cin>>n){ vector<Point> origin; //模板坐标 vector<Point> result; //最终结果坐标 vector<Point> temp; char c; //提取模板中的字符 cin.ignore(6, '\n'); // 清空输入流中的换行 for (int i = 0; i < n; i++){ cin.getline(str[i], 6); } // 将输入的模板字符数组转换成坐标 for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ if(isgraph(str[i][j])){ origin.push_back(Point(i, j)); c = str[i][j]; } } } cin >> time; result.assign(origin.begin(), origin.end()); // 开始放大,每放大一倍,结果坐标就和模板坐标卷积一次 for (int i = 1; i < time; i++){ for (vector<Point>::iterator it_origin = origin.begin(); it_origin < origin.end(); it_origin++){ for(vector<Point> ::iterator it_result = result.begin(); it_result<result.end(); it_result++){ temp.push_back(Point((*it_result).x + (*it_origin).x * pow(n, i), (*it_result).y + (*it_origin).y * pow(n, i))); } } result.clear(); // 先将result清空。然后再和temp交换 result.swap(temp); // 现在result中就是最新的值,然后temp为空 } // 创建最后的画布 int dime = pow(n, time); char **paint = new char*[dime+1]; for (int i = 0; i < dime; i++) paint[i] = new char[dime+1]{' '}; // 根据坐标填充画布 for(vector<Point> ::iterator it = result.begin(); it<result.end(); it++){ paint[(*it).x][(*it).y] = c; } // 打印画布 for (int i = 0; i < dime; i++){ for (int j = 0; j < dime; j++){ if(isgraph(paint[i][j])) cout << c; else cout << " "; } cout << endl; } } }
使用了递归的方法
题目的关键在于确定最后打印的位置,我们可以分步确定,这是一种分形图像,对于每个层次(忽略局部)的图像,我们都知道在哪些地方绘画,通过递归的方法,一层层传递,将位置从整体传递到具体的局部,最终得到答案。
#include <iostream> #include <cmath> #include <vector> using namespace std; void paint_to_array(int n, int size, int begin_row, int begin_col, vector<vector<char>>& template_array, vector<vector<char>>& painting_array); void paint_to_array(int n, int size, int begin_row, int begin_col, vector<vector<char>>& template_array, vector<vector<char>>& painting_array) { if (size == n) { for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { painting_array[begin_row + i - 1][begin_col + j - 1] = template_array[i][j]; } } return; } else { int next_size = size / n; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { if (template_array[i][j] != ' ') { int next_begin_row = begin_row + (i - 1) * next_size; int next_begin_col = begin_col + (j - 1) * next_size; paint_to_array(n, next_size, next_begin_row, next_begin_col, template_array, painting_array); } } } } } int main() { int n = 0, m = 0; while (cin >> n) { if (n == 0) { break; } vector<vector<char>> template_array(n + 1, vector<char>(n + 1, ' ')); char temp; cin.get(temp); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { cin.get(temp); template_array[i][j] = temp; } cin.get(temp); } cin >> m; int painting_size = pow(n, m); vector<vector<char>> painting_array(painting_size + 1, vector<char>(painting_size + 1, ' ')); paint_to_array(n, painting_size, 1, 1, template_array, painting_array); for (int i = 1; i <= painting_size; ++i) { for (int j = 1; j <= painting_size; ++j) { cout << painting_array[i][j]; } cout << endl; } } }
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <string> using namespace std; string temp[5]; char base[5][6];//原模式 char load[1500][1500];//输出 char load_1[1500][1500];//输出 int len;//load中的原复制区域,因为是正方形矩阵,所以是len*len int n, q; //原模式大小和放大倍数 bool isempty;//原模式是否空 bool swichto = false;//切换原复制区,因为放大一倍后原复制区域会发生变化 void copytoload(int a, int b) { //迭代复制器 for (int i = 0; i < len; i++) { for (int j = 0; j < len; j++) { if (swichto) { if (!isempty) load[a + i][b + j] = load_1[i][j]; else load[a + i][b + j] = ' ';//填空白 } else { if (!isempty) load_1[a + i][b + j] = load[i][j]; else load_1[a + i][b + j] = ' ';//填空白 } } } } void position(int i, int j) { //迭代位置复制器,i j 为源模式的位置,e为目前倍数 copytoload(len * i, len * j); } void initbase() { //初始化空格 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { base[i][j] = ' '; } } //从string 转移 for (int i = 0; i < n; i++) { for (int j = 0; j < temp[i].size(); j++) { base[i][j] = temp[i][j]; } // cout<< "the string length is :" << temp[i].size()<<endl; } } //把原模式复制到第一块放大版中 void inittoload() { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { load[i][j] = base[i][j]; } } } int main() { string trans; while (true) { // scanf("%d\n", &n) != EOF getline(cin, trans);//我发现使用getline的时候,如果第一个getline()读取的第一个字符为空格,这个空格就会被丢弃,在这里用getline(),那么下一个读入原模式的getline()就可以读入空格了。 n=(int)trans[0]-'0'; // cout << n<<endl; if (n < 3) { return 0; } //确保load开始 swichto = false; for (int i = 0; i < n; i++) { getline(cin, temp[i]); } initbase(); inittoload(); scanf("%d\n", &q); // // 数据检验 // for (int i=0; i<n; i++) { // for (int j=0; j<n; j++) { // cout<< load[i][j]; // } // cout << endl; // } // cout << "@@@@@@@" << endl; //迭代复制 for (int i = 1; i <= q; i++) { //i为放大倍数,迭代 len = pow(n, i); //计算原复制区大小 //从源模式开始判断复制 for (int a = 0; a < n; a++) { for (int b = 0; b < n; b++) { if (base[a][b] != 32 ) isempty = false; else isempty = true; position(a, b); } } swichto = !swichto;//切换复制板 } //输出 if (swichto) for (int i = 0; i < len; i++) { for (int j = 0; j < len; j++) { cout << load[i][j]; } cout << endl; } else for (int i = 0; i < len; i++) { for (int j = 0; j < len; j++) { cout << load_1[i][j]; } cout << endl; } // cout << "@@@@@@@" << endl; } }
#include <cstdio> #include <iostream> #include <string> #include <cmath> using namespace std; string mini[5]; char pattern[3000][3000],pattern1[3000][3000]; void bigger(int n,int q) { if (q == 1) { for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) pattern1[i][j] = mini[i][j]; return; } if (q > 1) bigger(n, q - 1); int nowN = pow(n, q - 1), x = 0, y = 0; for (int i = 0; i < nowN; ++i) { for (int j = 0; j < nowN; ++j) { if (pattern1[i][j] != ' ') { for (int q = x; q < x + n; ++q) for (int s = y; s < y + n; ++s) pattern[q][s] = mini[q - x][s - y]; } else { for (int q = x; q < x + n; ++q) for (int s = y; s < y + n; ++s) pattern[q][s] = ' '; } y += n; } x += n; y = 0; } nowN *= n; for (int i = 0; i < nowN; ++i) for (int j = 0; j < nowN; ++j) pattern1[i][j] = pattern[i][j]; } int main() { int n, q; while (scanf("%d", &n) != EOF) { if (n == 0) break; getchar(); for (int i = 0; i < n; ++i) getline(cin, mini[i]); scanf("%d", &q); bigger(n, q); for (int i = 0; i < pow(n, q); ++i) { for (int j = 0; j < pow(n, q); ++j) { printf("%c", pattern1[i][j]); } printf("\n"); } } }
/* 题目翻译: 描述: 和谐在我们的日常生活中是不可或缺的, 任何人都离不开它——也许Facer是唯一的例外。 有一天,有传言说重复绘画会创造和谐,然后数百人开始了他们无尽的绘画。 他们的画是以一个小模板和一种简单的复制方法为基础的。 虽然Facer很容易想象出整个画面的风格,但他找不到本质上的和谐。 现在你需要通过在电脑上显示图片来帮助Facer。 你会得到一个只包含一种字符和空间的模板, 该模板显示了无尽的画面是如何创建的——将字符作为基本元素, 并将它们放在正确的位置,以形成一个更大的模板,然后重复。 这是一个例子。###<-模板## 所以第1级图片将是######第2级图片将为############# 输入描述: 输入包含多个测试用例。 每种情况的第一行是整数N,表示模板的大小为N*N(N只能是3、4或5)。 接下来的N行描述模板。下一行包含一个整数Q,它是图片的缩放级别。 输入以N=0的情况结束。保证一张图片的大小不超过3000*3000。 输出描述: 对于每个测试用例,只需使用给定的模板打印Q级图片即可。 */ #include <array> #include <iostream> #include <string> #include <vector> using namespace std; //自定义数据类型 using Matrix = array<array<char, 3000>, 3000>; //字符矩阵 using SmallMatrix = vector<string>; //字符小矩阵(为节省空间) //全局变量 Matrix picture, oldPicture; //用矩阵存储图形 SmallMatrix originalTemplate; //原始图形模板 int size, oldSize; //矩阵大小(行数和列数) //将矩阵m1的内容复制到矩阵m2,复制起点的行列下标为i和j,矩阵大小为size void copyMatrix(Matrix m1, Matrix& m2, int i, int j, int size) { for (int a = 0; a < size; a++) { for (int b = 0; b < size; b++) { m2[i + a][j + b] = m1[a][b]; } } } //将矩阵m的内容清空为空格(用空格填充),矩阵大小为size void clearMatrix(Matrix& m, int size) { for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { m[i][j] = ' '; } } } //绘图函数,绘制出的图形以字符矩阵形式存储到全局变量picture中 //oldPicture存储前一次函数调用绘制的图形 void draw(int n, int q) { if (q == 1) { ::size = n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { picture[i][j] = originalTemplate[i][j]; } } return; } draw(n, q - 1); //递归调用绘图函数 copyMatrix(picture, oldPicture, 0, 0, ::size); oldSize =::size; ::size *= n; clearMatrix(picture, ::size); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (originalTemplate[i][j] != ' ') { copyMatrix(oldPicture, picture, i * oldSize, j * oldSize, oldSize); } } } } int main() { int n, q; while (cin >> n && n != 0) { getchar(); //吃掉回车 originalTemplate.clear(); //清空矩阵 for (int i = 0; i < n; i++) { //读取模板 string str; getline(cin, str); originalTemplate.push_back(str); } cin >> q; draw(n, q); //绘制图形 for (int i = 0; i <::size; i++) { for (int j = 0; j <::size; j++) { cout << picture[i][j]; } cout << endl; } } return 0; }
#include<stdio.h> #include<math.h> using namespace std; char tpl[5][5]; char picture[3000][3000]; void draw(int n, int q, int x, int y){ if(q == 1){ for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ picture[x + i][y + j] = tpl[i][j]; } } }else{ int length = pow(n, q - 1); for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(tpl[i][j] != ' '){ draw(n, q - 1, x + i * length, y + j * length); } } } } } int main(){ int n, q; scanf("%d", &n); while(n != 0){ getchar(); char ch; for(int i = 0; i < n; i++){ int j = 0; while((ch = getchar()) != '\n'){ tpl[i][j] = ch; j++; } } scanf("%d", &q); for(int i = 0; i < 3000; i++){ for(int j = 0; j < 3000; j++){ picture[i][j] = ' '; } } draw(n, q, 0, 0); int len = pow(n, q); for(int i = 0; i < len; i++){ for(int j = 0; j < len; j++){ printf("%c", picture[i][j]); //picture[i][j] = ' '; } printf("\n"); } scanf("%d", &n); } return 0; }