1.代码实现
#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];
}
}
}#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n;
char a,b;
while(scanf("%d %c %c",&n,&a,&b)!=EOF){
printf(" ");
int temp=n-2;
while(temp!=0){
printf("%c",a);
temp--;
}
printf(" ");
printf("\n");
for(int i=1 ; i<n/2 ; i++){ //for循环处理前一半
temp=i; //处理一行的前面部分,a,b交叉打印
while(temp!=0){
printf("%c",a);
temp--;
if(temp!=0){
printf("%c",b); temp--;
}
}
temp=n-2*i; //处理一行的中间部分,根据第行号奇偶打印
while(temp!=0){
if(i%2==0){
printf("%c",a); temp--;
}
else{
printf("%c",b); temp--;
}
}
temp=i; //处理一行的后面部分,a,b交叉打印
while(temp!=0){
if(temp%2==0){
printf("%c",b); temp--;
}
else{
printf("%c",a); temp--;
}
}
if(temp==0) printf("\n");
}
int j=n; //处理中间一行
while(j!=0){
printf("%c",a);
j--;
if(j!=0){
printf("%c",b); j--;
}
}
printf("\n");
for(int k=n/2+1 ; k<n ; k++){ //对称,照搬之前for循环,更改temp值
temp=n-k-1; //处理一行的前面部分,a,b交叉打印
while(temp!=0){
printf("%c",a);
temp--;
if(temp!=0){
printf("%c",b); temp--;
}
}
temp=n-2*(n-k-1); //处理一行的中间部分,根据第行号奇偶打印
while(temp!=0){
if(k%2==0){
printf("%c",a); temp--;
}
else{
printf("%c",b); temp--;
}
}
temp=n-k-1; //处理一行的后面部分,a,b交叉打印
while(temp!=0){
if(temp%2==0){
printf("%c",b); temp--;
}
else{
printf("%c",a); temp--;
}
}
if(temp==0) printf("\n");
}
printf(" ");
temp=n-2;
while(temp!=0){
printf("%c",a);
temp--;
}
printf(" ");
printf("\n");
}
return 0 ;
}
//输出结果
for (int i = 0; i < n * len; i++) {
for (int j = 0; j < n * len; j++) {
cout << res[i][j];
}
cout << endl;
}
}
return 0;
}