题解 | Repeater
Repeater
https://www.nowcoder.com/practice/97fd3a67eff4455ea3f4d179d6467de9
分层求每个元素映射到模板的位置
#include <iostream>
#include <cstring>
using namespace std;
char mod[5][5], ch;
int n, q, sz;
// a的k次方(cmath的pow是浮点运算)
int pow(int a, int k) {
int res = 1;
while (k--) res *= a;
return res;
}
int main() {
while (cin >> n, n != 0) {
cin.ignore(); // 丢掉 '\n'
for (int i = 0; i < n; i++) {
cin.getline(mod[i], 6);
// 获取非空字符
for (int j = 0; j < n; j++)
if (mod[i][j] != ' ')
ch = mod[i][j];
}
cin >> q;
sz = pow(n, q);
// 每个元素映射到模板的位置
for (int i = 0; i < sz; i++) {
for (int j = 0; j < sz; j++) {
bool ok = true;
int x = i, y = j;
// 层数由大到小分析
for (int k = q - 1; k >= 0; k--) {
// 本层块的大小
int lsz = pow(n, k);
// 计算 (x, y) 映射到模板的哪一块
if (mod[x / lsz][y / lsz] == ' ') {
// 映射到空块可直接退出
ok = false;
break;
}
// 计算下一层的坐标
x %= lsz;
y %= lsz;
}
cout << (ok ? ch : ' ');
}
cout << endl;
}
}
return 0;
}
查看18道真题和解析