题解 | #Repeater#

Repeater

http://www.nowcoder.com/practice/97fd3a67eff4455ea3f4d179d6467de9

#include<string>
#include<math.h>

using namespace std;

char result[3000][3000];
// temple为模板,n为模板大小,scale为规模,pos:起始行数
void show(char temple[][6], int n, int scale, int pos_x, int pos_y){
	if(scale == 1){ 
		// 输出模板
		for(int i=0; i<n; i++)
			for(int j=0; j<n; j++)
				result[pos_x+i][pos_y+j] = temple[i][j];
	}else{
		for(int i=0; i<n; i++){
			for(int j=0; j<n; j++){
				if(temple[i][j] != ' ')
					show(temple, n, scale-1, pos_x+int(i*pow(n,(scale-1))), pos_y+int(j*pow(n,(scale-1))));
			}
		}
	}
}

void showResult(int n[], int scale[], int count){
	int pos_x=0,pos_y=0;
	for(int i=0; i<count; i++){
		for(int j=0; j<pow(n[i],scale[i]); j++){
			for(int k=0; k<pow(n[i],scale[i]); k++){
				cout << result[pos_x+j][k];
			}
			cout << endl;
		}
		pos_x += int(pow(n[i],scale[i]));
	}
}

// 用递归
int main(){
	int n[100]; // 模板大小n[i]*n[i]
	int scale[100];  // 放大倍数
	char temple[100][6][6];  // 最大5x5
	int count=0; // 图案个数
	int i,j;

	for(i=0; i<3000; i++){
		for(j=0; j<3000; j++){
			result[i][j] = ' ';
		}
	}
    
	cin >> n[count++];
	while(n[count-1] != 0){
		for(int i=0; i<n[count-1]; i++){
			char temp[6];
			cin.get(); // 先吸收回车
			cin.get(temp,n[count-1]+1);
			for(int j=0; j<n[count-1]; j++){
				temple[count-1][i][j] = temp[j];
			}
		}
		cin >> scale[count-1];
		cin >> n[count++];
	}
	count--;  // 减去最后那个0
	int pos=0;
	show(temple[0], n[0], scale[0], pos, 0);
	for(int i=1;i<count;i++){
		pos += int(pow(n[i-1],scale[i-1]));  // 下一个的起始位置
		show(temple[i], n[i], scale[i], pos, 0);  // 行、列
	}
	showResult(n, scale, count);
	return 0;
}
全部评论

相关推荐

狠赚笔第一人:学计算机自己不努力怪大环境?我大一就拿到了美团大厂的offer,好好看看自己有没有努力查看图片
点赞 评论 收藏
分享
Noel_:中石油是这样的 哥们侥幸混进免笔试名单 一看给我吓尿了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务