题解:可变的LOGO
题目描述
FJ给自己农场设计了一个有大写字母O和点号组成的可变Logo,当输入1时,logo如下图所示:

当输入2时,logo如下图所示:

当输入3时,logo如下图所示:

请仔细观察图形并总结规律,现在给定一个数字\(n\),请输出图形。
输入格式
输入一行1个整数\(n\)(\(n \leq 50\)),如题意所述。
输出格式
输出一个按题目要求打印出来的图形。
输入输出样例
输入样例 1
3
输出样例 1
(此处无法贴图,样例输出见题目描述)
思路
一行一行打印,具体看代码
代码
#include <bits/stdc++.h>
using namespace std;
int x,l,lx=1,lh,r=1,rx=5;
char c[160];
int main() {
cin >> x;
int n=5+x*4; // 计算图形总宽度,基础5加上n*4
lh=n-8; // 中间高度相关变量
// 输出顶部第一行:两侧点,中间O
cout << "..";
for(int i=3; i<n-1; i++) cout << "O";
cout << ".." << endl;
// 输出顶部第二行:左右第三列O,其余点
for(int i=1; i<=n; i++) {
if(i==3||(n-i+1)==3) cout << "O";
else cout << ".";
}
cout << endl;
// 处理上半部分图形(到中间行)
for(int i=3; i<=n/2; i++) {
if(i%2) { // 奇数行处理扩展结构
for(int j=1; j<=l; j++) cout << "O.";
cout << "OOO.";
for(int j=1; j<=lh; j++) cout << "O";
cout << ".OOO";
for(int j=1; j<=l; j++) cout << ".O";
lh-=4,l++; // 调整控制变量
cout << endl;
} else { // 偶数行处理中间收缩结构
for(int j=1; j<=r; j++) cout << "O.";
for(int j=2*r+1; j<=(n-2*r); j++) {
if(j==rx||j==(n-rx+1)) cout << "O";
else cout << ".";
}
for(int j=1; j<=r; j++) cout << ".O";
r++,rx+=2; // 调整控制变量
cout << endl;
}
}
// 输出图形正中间行:五个O的核心结构
for(int i=1; i<=l; i++) cout << "O.";
cout <<"OOOOO";
for(int i=1; i<=l; i++) cout << ".O";
cout << endl;
// 调整变量为下半部分对称做准备
r--,rx-=2,lh+=4,l--;
// 处理下半部分图形(对称上半部分)
for(int i=n/2; i>=3; i--) {
if(i%2) { // 奇数行对称处理
for(int j=1; j<=l; j++) cout << "O.";
cout << "OOO.";
for(int j=1; j<=lh; j++) cout << "O";
cout << ".OOO";
for(int j=1; j<=l; j++) cout << ".O";
lh+=4,l--; // 恢复变量状态
cout << endl;
} else { // 偶数行对称处理
for(int j=1; j<=r; j++) cout << "O.";
for(int j=2*r+1; j<=(n-2*r); j++) {
if(j==rx||j==(n-rx+1)) cout << "O";
else cout << ".";
}
for(int j=1; j<=r; j++) cout << ".O";
r--,rx-=2; // 恢复变量状态
cout << endl;
}
}
// 输出底部第二行:对称顶部第二行
for(int i=1; i<=n; i++) {
if(i==3||(n-i+1)==3) cout << "O";
else cout << ".";
}
cout << endl;
// 输出底部第一行:对称顶部第一行
cout << "..";
for(int i=3; i<n-1; i++) cout << "O";
cout << ".." << endl;
return 0;
}

浙公网安备 33010602011771号