【zzulioj 2844: 圣诞树(^-^)V】

ZZULIOJ

先上代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char x[101][101];
int main(){
    for (int a=1;a<=100;a++)
        for (int b=1;b<=100;b++){
        x[a][b]=' ';
    }
    int r,d,r1,h1,r2,h2,r3;
    cin>>r>>d>>r1>>h1>>r2>>h2;
    r3=r2>(r+2*d)?r2:(r+2*d);
    int b0=(r3+1)/2;
    int l1=(r+1)/2;
    int l2=(r+d+1)/2;
    int l3=(r+2*d+1)/2;
    for (int b=(r3-r2)/2+1;b<=(r3+r2)/2;b++){
        for (int a=l1+l2+l3+h1+1;a<=l1+l2+l3+h1+h2;a++)
            x[a][b]='*';
    }   
    for (int b=(r3-r1)/2+1;b<=(r3+r1)/2;b++){
        for (int a=l1+l2+l3+1;a<=l1+l2+l3+1+h1;a++)
            x[a][b]='*';
    }
    for (int a=1;a<=l1;a++){
        for (int b=(r3-r)/2+1;b<=(r3-r)/2+r;b++){
            if (abs(b-b0)+abs(a-l1)<=r/2||abs(b-b0)+abs(a-l1)==0)
                x[a][b]='*';
        }
    }
    for (int a=l1+1;a<=l1+l2;a++){
        for (int b=(r3-r-d)/2+1;b<=(r3-r-d)/2+r+d;b++){
            if (abs(b-b0)+abs(a-l1-l2)<=(r+d)/2||abs(b-b0)+abs(a-l1-l2)==0)
                x[a][b]='*';
        }
    }
    for (int a=l1+l2+1;a<=l2+l1+l3;a++){
        for (int b=(r3-r-2*d)/2+1;b<=(r3-r-2*d)/2+r+2*d;b++){
            if (abs(b-b0)+abs(a-l1-l3-l2)<=(r+2*d)/2||abs(b-b0)+abs(a-l1-l3)==0)
                x[a][b]='*';
        }
    }
    for (int a=1;a<=l1+l2+l3+h1+h2;a++){
        for (int b=1;b<=r3;b++){
            putchar(x[a][b]);
        }
        cout<<endl;
    }
}

对我来说算是一道意义很大的题目,之前从学长哪里学到了使用一个二维数组储存空格和其他字符从而不用考虑空格的问题,只考虑字符就行了。

———————————————————————————————————————————

通过这一题暴露出来的问题:

对于多块图形,当不知道哪块处于左边界时(因为要用数组打印,所以要找到边界),即不知道以哪一块为边界时,找到最宽的那一块,以它为基础,啊,我这语言叙述能力太差了,用图片表示罢

比如:

====aaa====       x个a

aaaaaaaaaaaa      y个a

以=代表空格,a即非空格字符,使用数组打印时(以1开始)二行最长,以二行为基础,

第一次打印第一行的a时的下标为  (y-a)/2+1

———————————————————————————————————————————

回到这一题,虽然看起来很多代码,但是核心代码就两块,其他的都是基于这两块进行小改得来的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值