题目

输入:
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
思路分析
首先明确这是一道模板输出题目,即根据现有模板,进行加工输出。
- 如果我们找不到如何下手,首先可以利用excel进行手动模拟,如下所示:
由题意知道,每次是将如33的规模中为#
的位置替换为33的单元,那么就可以构造为99的规模,原理很简单。那么空格的位置又是如何确定呢?仔细观察可知,由于题目所给的图案都是刚好在一个正方体内,那么显然,一个空格直接替换为33的单元即可。如果不好理解,反过来思考,有#
的位置都替换为33,如果空格位置不是替换为33的规模,那么就不是成比例扩大了。
- 在第一步的基础上,我们就易于用代码实现。(该题两种类型题解,此处提供不使用DFS的方案实现)
代码解析
#include<iostream>
#include<string>
#include<math.h>
char patern[300][300]{};
char _patern[300][300]{};
using namespace std;
int main()
{
int size, scale, one;
string str;
while (cin >> size && size) {
cin.get(); //吃掉回车
for (int i = 0; i < size; ++i) {
getline(cin, str);
for (int j = 0; j < str.size(); ++j) {
_patern[i][j] = str.at(j); //最小的模板单元
patern[i][j] = str.at(j); //每次参照的模板
}
}
//读入输出规模
cin >> scale;
one = size;
for (int i = 2; i <= scale; ++i) {
size = pow(one, i - 1); //规模扩大
char t_out[300][300]{};
//对模板的每一个字符进行判断,以便进行扩大
for (int _row = 0; _row < size; ++_row) {
int pos_num = 0;
for (int _col = 0; _col < size; ++_col) {
//填充空格,等比例填充空格数
if (patern[_row][_col] == ' ') {
for (int ii = 0; ii < one; ++ii) {
for (int jj = 0; jj < one; ++jj) {
t_out[_row * one + ii][pos_num * one + jj] = ' ';
}
}
pos_num++;
}
//填充字符
else {
for (int ii = 0; ii < one; ++ii) {
for (int jj = 0; jj < one; ++jj) {
t_out[_row * one + ii][pos_num * one + jj] = _patern[ii][jj];
}
}
pos_num++;
}
}
}
//更新下一次参照的模板
for (int ii = 0; ii < pow(one, i); ++ii) {
for (int jj = 0; jj < pow(one, i); ++jj) {
patern[ii][jj] = t_out[ii][jj];
}
}
}
for (int ii = 0; ii < pow(one, scale); ++ii) {
for (int jj = 0; jj < pow(one, scale); ++jj) {
cout << patern[ii][jj];
}
cout << endl;
}
}
}
牛客网判断结果