蓝桥杯 PREV-2 打印十字图

作者分享了在解决打印图形问题时遇到的心酸过程及最终通过重新构思优化代码顺利解决问题的经验。从最初的困惑到后来的轻松修改,文章详细展示了代码的调整过程和关键优化点,旨在提升读者的思维训练和代码调试能力。

这里写图片描述

这里写图片描述

这里写图片描述

打印图形,找规律,

昨晚蓝桥杯辅导老师讲历年试题,其中有这道,想着回来试吧试吧,之后就一段心酸史,昨天右半部分有一条线死活打印不对,也不知如何改了,今天睡醒简单想了一下就打印出来了,这种打印题一遍思路下来,出错了很难找,找到了很难改,先放下,回过头再重新构思一遍就很轻松的改正确了。
本人是按照层数打印的,每层打印外圈边框,逐层深入,最后打印中间十字,打印边框时,本人先画上下两条边,再左右两条边,再竖着四条短边,在横着四条短边,在最后一步横着打印四条短边时,右侧的边出现了计算失误,导致没画正确,整个写下来之后,很费脑筋,再改的话,改了一个小时没改对,师兄叫我明天再来,今天先放一放,才勉强的放下了,今天十多分钟就改好了,昨天还是有点懵逼,这要是在比赛中,估计跪了。思维训练有待加强。

不多说,下面附代码:

/*************************************************************************
    > File Name: prev_2.cpp
    > Author: dulun
    > Mail: dulun@xiyoulinux.org
    > Created Time: 20160314日 星期一 204150************************************************************************/

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
using namespace std;

const int N = 506;
char a[N][N]; 
int n;

void print()
{
    int m = 4*n+5;
    for(int i = 0; i < m; i++)
    {
        for(int j = 0; j < m; j++)
        {
            cout<<a[i][j];
        }
        cout<<endl;
    }
}

void make()
{

    int m = 4*n+5;

    for(int i = 0; i < m; i++)
    for(int j = 0; j < m; j++) 
    {
        a[i][j] = '.';
    } 


    for(int ceng = 1; ceng <= n; ceng++)
    {

        for(int i = 2*ceng; i < m - 2*ceng; i++ )
        {//上下
            a[2*(ceng-1)][i] = '$';
            a[m-1-(ceng-1)*2][i] = '$';
        }
        for(int i = (ceng)*2; i < m - 2*ceng; i++)
        {//左右
            a[i][(ceng-1)*2] = '$';
            a[i][m-1-(ceng-1)*2] = '$';
        }

        for(int i = (ceng-1)*2; i < (ceng-1)*2+3; i++)
        {
            a[i][2*ceng] = '$';
            a[i][m-2*ceng-1] = '$';//
        }
        for(int i = m-1-(ceng-1)*2-2; i < m-1-(ceng-1)*2+1; i++ )
        {
            a[i][2*ceng] = '$';
            a[i][m-2*ceng-1] = '$';
        }

        for(int i = (ceng-1)*2; i < (ceng-1)*2+3; i++)
        {
            a[2*ceng][i] = '$';
           // a[2*ceng][i+m-2*ceng] = '$';//
        }
        for(int i = 0; i < 3; i++)
        {//第二天改的,第一天在一个循环中,闷了很久,今天索性重另开循环新打印吧
            a[2*ceng][i+m-1-2*ceng] = '$';
        }

        for(int i = (ceng-1)*2; i < (ceng-1)*2+3; i++)
        {
            a[m-ceng*2-1][i] = '$';
           // a[m-ceng*2-1][m-2*ceng-3+i-1] = '$';
           //这句死活没对,也不想改了,另开一重循环,单独打印这条线,就是右下部分一条短线
        }
        for(int i = 0; i < 3; i++)
        {
            a[m-ceng*2-1][m-1-2*ceng+i] = '$';
        }
    }
    for(int i = 0; i < 5; i++) //最后中间十字
    {
        int k = (m+1)/2-1;
        a[k][2*n+i] = '$';
        a[2*n+i][k] = '$';
    }
}


int main()
{
    scanf("%d", &n);
    make();
    print();

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值