本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
将图形分成上边的一个三角形和下边的一个梯形,设上边的三角形有n层,找规律得到这个图形一共有2*n^-1个小星星
在三角形的n行中,找每一行两端的横纵坐标关系
注意!只在符号左边补充空格,右边不补充(不清楚这个坑的意义在哪)
还有一点就是数组大小,n最大为1000,可以用的最大符号数是2*n*n-1,这样算下来n最大为22,一共有43行
#include<iostream>
using namespace std;
char a[43][43];
int main(){
int x,n;
char c;
cin>>x>>c;
//根据每次小星星的个数都是2*n^2-1,先找到这个n
for(int i=1;i<=23;i++){
if(2*i*i-1<=x&&x<2*i*i+4*i+1){
n=i;
break;
}
}
for(int i=1;i<=2*n-1;i++){
for(int j=1;j<=2*n-1;j++){
a[i][j]=' ';
}
}
for(int i=1;i<=n;i++){
for(int j=i;j<=2*n-i;j++){
a[i][j]=c;
}
}
for(int i=n+1;i<=2*n-1;i++){
for(int j=2*n-i;j<=i;j++){
a[i][j]=c;
}
}
int leave=x-2*(n*n)+1;
for(int i=1;i<=n;i++){
for(int j=1;j<=2*n-i;j++){
cout<<a[i][j];
}
cout<<"\n";
}
for(int i=n+1;i<=2*n-1;i++){
for(int j=1;j<=i;j++){
cout<<a[i][j];
}
cout<<"\n";
}
cout<<leave;
}