pat1027
2018-10-05 本文已影响0人
hsinsDfy
1027 打印沙漏 (20 分)
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
2
#include<iostream>
#include<vector>
using namespace std;
int main(){
int N;
char c;
cin>>N>>c;
int t=0;
vector<int>a;
//a.push_back(1);
if(N>=7){
N-=1;
int t=3;
while(N>=2*t){
a.push_back(t);
N=N-2*t;
t=t+2;
}
}
else
cout<<c<<endl<<N-1;
vector<int>::iterator it;
if(!a.empty()){
int beg=*(a.end()-1);
for(it=a.end()-1;it!=a.begin();--it ){
int temp=*it;
for(int j=(beg-temp)/2;j>0;--j)
cout<<" ";
while(temp!=0){
cout<<c;
--temp;
}
cout<<endl;
}
for(int j=(beg-*(a.begin()))/2;j>0;--j){
cout<<" ";
}
for(int j=*(a.begin());j>0;--j){
cout<<c;
}
cout<<endl;
for(int j=(beg-1)/2;j>0;--j){
cout<<" ";
}
cout<<c;
cout<<endl;
for(it=a.begin();it!=a.end();++it ){
int temp=*it;
for(int j=(beg-temp)/2;j>0;--j)
cout<<" ";
while(temp!=0){
cout<<c;
--temp;
}
cout<<endl;
}
cout<<N<<endl;
}
system("pause");
return 0;
}