题解:可变的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;
}
posted @ 2025-07-12 12:58  优优的晴空  阅读(17)  评论(0)    收藏  举报