【题目】
时间限制:1.0s 内存限制:256.0MB
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入
3
输出
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
思路分析
思路:注意观察,然后通过 层次覆盖法。
层次覆盖法:一层一层的叠加,从最外层(底层)开始;为达到十字效果,通过 两个行列 相反的 矩阵覆盖叠加 而成, 做完一个外十字做下一个十字时,需要注意缩进。
完成后大致是这个样子。蓝色部分代表 ‘ . ’ 红色部分 代表‘ $ ’
详细步骤
- 首先把底面全部盖上 '.' (如下所示)
- 接下来加上一层,就是加上一个红色的矩阵,盖在蓝色底上面。
继续加一层,构成一个十字。
以此类推即可完成填充。蓝色部分代表 ‘ . ’ 红色部分 代表‘ $ ’,两层轮换来填。
同时,这里还有一个小技巧!
利用对称性。
矩阵 A 可以看作是 矩阵 B 的转置。因此,坐标是沿着 主对角线 对称的。
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
char map[150][150];
cin >> n;
int r = 4 * n + 5; //矩阵长宽
int t = n + 1; //层的次数
//填好第一层
for(int i = 1; i <= r; i++){
for(int j = 1; j <= r; j++){
map[i][j] = '.';
}
}
//剩下一层一层填
for(int k = 1; k <= t; k++){
//遍历每一层
//以两层为一对,外层填 $ ,里层填 .
for(int i = 1 + 2 * k; i <= r - 2 * k; i++){
for(int j = 1 + 2 * k - 2; j <= r - (2 * k - 2); j++){
//对称性
map[i][j] = '$';
map[j][i] = '$';
}
}
for(int i = 1 + 2 * k + 1; i <= r - 2 * k - 1; i++){
for(int j = 1 + 2 * k - 1; j <= r - (2 * k - 2) - 1; j++){
//对称性
map[i][j] = '.';
map[j][i] = '.';
}
}
}
for(int i = 1; i <= r; i++){
for(int j = 1; j <= r; j++){
cout << map[i][j];
}
cout<<endl;
}
return 0;
}
总结
确实学习到了,这种方法也是第一次见,还需要多多积累。