先上代码
#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
———————————————————————————————————————————
回到这一题,虽然看起来很多代码,但是核心代码就两块,其他的都是基于这两块进行小改得来的