打印十字图
一、题目内容
问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
..$$$$$$$$$$$$$.. ..$...........$.. $$$.$$$$$$$$$.$$$ $...$.......$...$ $.$$$.$$$$$.$$$.$ $.$...$...$...$.$ $.$.$$$.$.$$$.$.$ $.$.$...$...$.$.$ $.$.$.$$$$$.$.$.$ $.$.$...$...$.$.$ $.$.$$$.$.$$$.$.$ $.$...$...$...$.$ $.$$$.$$$$$.$$$.$ $...$.......$...$ $$$.$$$$$$$$$.$$$ ..$...........$.. ..$$$$$$$$$$$$$..
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。
输入
一个正整数 n (n< 30) 表示要求打印图形的层数。
输出
对应包围层数的该标志。
样例输入
3
样例输出
..$$$$$$$$$$$$$.. ..$...........$.. $$$.$$$$$$$$$.$$$ $...$.......$...$ $.$$$.$$$$$.$$$.$ $.$...$...$...$.$ $.$.$$$.$.$$$.$.$ $.$.$...$...$.$.$ $.$.$.$$$$$.$.$.$ $.$.$...$...$.$.$ $.$.$$$.$.$$$.$.$ $.$...$...$...$.$ $.$$$.$$$$$.$$$.$ $...$.......$...$ $$$.$$$$$$$$$.$$$ ..$...........$.. ..$$$$$$$$$$$$$..
二、思路分析
观察n=3的样例可以发现,图中间是固定十字,然后根据n的层数一层一层套圈,并且图形是上下左右对称的,只需要处理好图的1/4就好了,例如处理左上角1/4的方法:
void quater(int x, int y, int w) { //画n层绕圈(左上角1/4)
t[x][y] = '$';
for (int i = 1; i <= w; i++) { //向上走w
t[--x][y] = '$';
}
for (int i = 1; i <= 2; i++) { //向右走2
t[x][++y] = '$';
}
for (int i = 1; i <= 2; i++) { //向上走2
t[--x][y] = '$';
}
for (int i = 1; i <= w; i++) { //向右走w
t[x][++y] = '$';
}
}
先将数组初始化为'.',然后画中间的十字,再画左上角1/4,再通过左右对称和上下对称画完其他的地方,最后输出。
三、代码实现
#include <bits/stdc++.h>
using namespace std;
char t[200][200];
void quater(int x, int y, int w) { //画n层绕圈(左上角1/4)
t[x][y] = '$';
for (int i = 1; i <= w; i++) { //向上走w
t[--x][y] = '$';
}
for (int i = 1; i <= 2; i++) { //向右走2
t[x][++y] = '$';
}
for (int i = 1; i <= 2; i++) { //向上走2
t[--x][y] = '$';
}
for (int i = 1; i <= w; i++) { //向右走w
t[x][++y] = '$';
}
}
int main() {
int n;
cin >> n;
int L = 5 + 4 * n;
for (int i = 1; i <= L; i++) { //初始化(全为’.’)
for (int j = 1; j < L; j++) {
t[i][j] = '.';
}
}
for (int i = L / 2 + 1 - 2; i <= L / 2 + 1; i++) { //画中间的十字(左上角1/4)
t[L / 2 + 1][i] = '$';
t[i][L / 2 + 1] = '$';
}
int row = L / 2 + 1;
int col = L / 2 + 1 - 4;
int walk = 2;
while (n--) { //画左上角四分之一 ,起点为(row,col)
quater(row, col, walk);
col -= 2;
walk += 2;
}
//左右对称
for (int j = L; j > L / 2 + 1; j--) {
for (int i = 1; i <= L / 2 + 1; i++) {
t[i][j] = t[i][L - j + 1];
}
}
//上下对称
for (int i = L; i > L / 2 + 1; i--) {
for (int j = 1; j <= L; j++) {
t[i][j] = t[L - i + 1][j];
}
}
//输出
for (int i = 1; i <= L; i++) {
for (int j = 1; j <= L; j++) {
cout << t[i][j];
}
cout << endl;
}
return 0;
}
加油哦! 如有错误和需要改进完善之处,欢迎大家纠正指教。