[蓝桥杯][历届试题]打印十字图
打印十字图-蓝桥杯历届试题
打印十字图-蓝桥杯历届试题
问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1
样例输入2
3
样例输出2
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。
分析:这个图形是中心对称的。所以,我们可以考虑从中间的点出发,找规律向外扩张。可以实现定义一个map二维数组记录图形。最后输出
#include<iostream>
using namespace std;
char map[130][130];
int main() {
int n, edge, mid;
cin >> n;
edge = 9 + 4 * (n - 1);
for (int i = 1; i <= edge; i++) {
for (int j = 1; j <= edge; j++) {
map[i][j] = '.';
}
}
int num = 1; //层数
mid = (edge + 1) / 2;
while(num <= n) {
if(num == 1) { //中间部分
for (int i = -2; i <= 2; i++) {
map[mid][mid + i] = '$';
}
for (int i = -2; i <= 2; i++) {
map[mid + i][mid] = '$';
}
}
int a = mid - (2 * (num - 1) + 4);
int b = mid + (2 * (num - 1) + 4);
for (int i = - 2 * num; i <= 2 * num; i++) { //边
map[a][mid + i] = '$';
map[b][mid + i] = '$';
map[mid + i][a] = '$';
map[mid + i][b] = '$';
}
for (int i = 1; i <= 2; i++) { //角
map[a + 2][a + i] = '$';
map[a + i][a + 2] = '$';
map[b - 2][a + i] = '$';
map[b - i][a + 2] = '$';
map[b - 2][b - i] = '$';
map[b - i][b - 2] = '$';
map[a + i][b - 2] = '$';
map[a + 2][b - i] = '$';
}
num++;
}
for (int i = 1; i <= edge; i++) {
for (int j = 1; j <= edge; j++) {
cout << map[i][j];
}
cout << endl;
}
return 0;
}